邮件发送相关

常见电子邮件协议

SMTP (Simple Mail Transfer

Protocol,简单邮件传输协议)

POP(Post Office Protocol,邮局协议)

IMAP(Internet Message Access ProtocolInternet 消息访问协议)

MIMEMultipurpose Internet Mail Extensions,多用途Internet 邮件扩展标准)不是邮件传

 

输协议,它只定义了需要传输的消息、附件及其他类型数据的格式。

1)SMTP

SMTPSimple Mail Transfer Protocal)称为简单邮件传输协议,目标是向用户提供高效、可靠

 

的邮件传输。

SMTP的一个重要特点是它能够在传送中接力传送邮件,即邮件可以通过不同网络上的主机接力式传

 

送。工作在两种情况下:一是电子邮件从客户机传输到服务器;二是从某一个服务器传输到另一个

 

服务器。 SMTP是个请求/响应协议,它监听25号端口,用于接收用户的邮件请求,并与远端邮件服

 

务器建立SMTP连接。

2)POP

POP的全称是 Post Office Protocol ,即邮局协议,用于电子邮件的接收,它使用TCP110端口

 

,现在常用的是第三版,所以简称为 POP3

POP3采用Client/Server工作模式。当客户机需要服务时,客户端的软件(Outlook Express

 

FoxMail)将与POP3服务器建立TCP连接,此后要经过POP3协议的三种工作状态,首先是认证过程,

 

确认客户机提供的用户名和密码,在认证通过后便转入处理状态,在此状态下用户可收取自己的邮

 

件或做邮件的删除,在完成响应的操作后客户机便发出quit命令,此后便进入更新状态,将做删除

 

标记的邮件从服务器端删除掉。到此为止整个POP过程完成。

3)MIME

MIME的英文全称是"Multipurpose Internet Email Extension" 多功能Internet 邮件扩充服务

 

,它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器

 

。服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME

 

类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将MIME

 

标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。

4)Java Mail体系可以分为三层:

抽象层,Internet邮件实现层,协议实现层

5)Java Mail抽象层:该层定义了用于邮件处理功能的抽象类、接口和抽象方法,所有的邮件系统

 

都支持这些功能,它独立于供应商和协议消息。抽象层位于Java Mail 顶级包(即javax.mail)内

 

 Internet 邮件实现层:该层实现了部分抽象层元素,它遵循Internet 标准―RFC822MIME

 

Internet 邮件实现层所定义的类和接口大多位于javax.mail.internet 包内。

协议实现层:该层由服务提供商实现对特定协议的支持,如SMTPPOPIMAP NNTPSun 为开发

 

者提供了很完备的一组协议的支持。

6)Java Mail主要对象

核心Java Mail API 可以分为两部分,一部分由七个主要对象组成:SessionMessageAddress

 

AuthenticatorTransportStore Folder,利用这些对象可以完成包括发送消息、检索消

 

息、删除消息、认证、回复消息、转发消息、管理附件、处理基于HTML 文件格式的消息及搜索或

 

过滤邮件列表等任务 

核心Java Mail API 的另一部分的主要接口和类包括PartMessageBodypartMultipart

 

MimePartMimeMessageMimiBodypart MimeMultipart,可以用这些类和接口完成电子邮件的

 

阅读、撰写等任务。

7)Java Mail API 的中文问题

如果开发者使用setSubject()方法直接设定中文的主题或者使用setText()方法直接指定中文内容

 

,那么在使用Outlook 等客户端软件查看邮件时客户有可能看到的将是一团乱码。

8)发送附件

发送附件非常像转发消息,程序开发人员需要建立各部分以组成完整消息,完成消息正文后,即开

 

始添加其他部件,其中每个 DataHandler 都代表附件,而不是转发消息情况下的共享处理程序。

 

如果从文件中读附件,附件的数据源是 FileDataSource。而如果从 URL 中读时,附件的数据源是

 

URLDataSource。一旦存在 DataSource,只要先把它传递给 DataHandler 构造器,最后再用

 

setDataHandler() 把它附加到 BodyPart。假定要保留附件的原始文件名,最终要做的是用

 

BodyPart setFileName() 方法设置与附件相关的文件名。

9)接收附件

从邮件中获取附件比发送它们要困难,因为 MIME 没有简单的关于附件的概念。当消息包含附件时

 

,消息的内容是个 Multipart 对象。接着,开发者需要处理每个 Part,获取主要内容和附件。标

 

有从 part.getDisposition() 获得的 Part.ATTACHMENT 配置(disposition)的部件(Part

 

无疑就是附件。但是,没有配置(及一个非文本 MIME 类型)和带 Part.INLINE 配置的部件也可

 

能是附件。当配置要么是 Part.ATTACHMENT,要么是 Part.INLINE 时,这个消息部件的内容就能

 

被保存。只要用 getFileName() getInputStream() 就能分别得到原始文件名和输入流。

10)课堂笔记及相关记录

发送邮件

  /** smtp手动发送邮件的前提:

        *

        * 第一个:提前注册免费账号

        * mail from:redarmycsdn@sohu.com 

        * 密码:111111

        *

        * rcpt to:redarmycsdn@sina.com

        * 密码:redarmycsdn

        *

        * 第二个:获取smtppop3服务器的名称

        * sina

        *    smtp.sina.com  smtp服务器

        *    pop.sina.com   pop3服务器

        * sohu

        *   smtp.sohu.com   smtp服务器

        *   pop3.sohu.com   pop3服务器

        *  

        *编写base64编码程序对用户名和密码进行编码

        *sina :redarmycsdn 111111 :cmVkYXJteWNzZG4=   MTExMTEx

        *sohu :redarmycsdn redarmycsdn:cmVkYXJteWNzZG4=   cmVkYXJteWNzZG4=

        *

        *发送邮件:

        * 语法:

        *

        */

 

  telnet smtp.sina.com

SMTP协议

ehlo redarmychen主机名

auth login

eWFuZ25pbmc(新浪)=(两次)//经过base64编码后的用户名和密码

mail from:<redarmycsdn@sohu.com> 

rcpt to:<redarmycsdn@sina.com>

Data 

内容

.号代表邮件内容的结束

quit

 

 

Myclipse中镶嵌代码发送邮件

  package cn.csdn.mail;

 

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.net.Socket;

import java.net.UnknownHostException;

 

public class SendMailBySocket {

      

       public static void main(String[] args) throws UnknownHostException,

 

IOException {

              //创建Socket对象

              Socket sk = new Socket("smtp.sohu.com",25);

              //输出流

              OutputStream os = sk.getOutputStream();

             

              //输入流   sk.getInputStream();

              BufferedReader br = new BufferedReader(new InputStreamReader

 

(sk.getInputStream()));

             

              System.out.println(br.readLine());

             

              os.write("ehlo redarmychen/r/n".getBytes());

              System.out.println(br.readLine());

              System.out.println(br.readLine());

              System.out.println(br.readLine());

             

              os.write("auth login/r/n".getBytes());

              System.out.println(br.readLine());

             

              os.write("cmVkYXJteWNzZG4=/r/n".getBytes());

              System.out.println(br.readLine());

              os.write("cmVkYXJteWNzZG4=/r/n".getBytes());

              System.out.println(br.readLine());

             

              os.write("mail from:<redarmycsdn@sohu.com>/r/n".getBytes());

              System.out.println(br.readLine());

             

              os.write("rcpt to:<redarmycsdn@sina.com>/r/n".getBytes());

              System.out.println(br.readLine());

             

             

              os.write("data/r/n".getBytes());

              System.out.println(br.readLine());

             

              os.write("YYYYYYYYYYYxxxxxxxxxxxyyyyyyy/r/n".getBytes());

             

              os.write("./r/n".getBytes());

              System.out.println(br.readLine());

              os.write("quit/r/n".getBytes());

             

             

             

              br.close();

              os.close();

              sk.close();

       }

 

}

 

 

 

 

 

邮件发送,发送世界上最复杂的邮件

  package cn.csdn.sendmail;

 

import java.io.FileOutputStream;

import java.util.Properties;

 

import javax.activation.DataHandler;

import javax.activation.FileDataSource;

import javax.mail.Message;

import javax.mail.Session;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeBodyPart;

import javax.mail.internet.MimeMessage;

import javax.mail.internet.MimeMultipart;

import javax.mail.internet.MimeUtility;

 

/*

 * 创建世界最复杂的邮件 即有图片又有附近

 * */

public class MailImageAndAttch {

 

       public static void main(String[] args)throws Exception {

              //1、创建邮件

              MimeMessage message = new MimeMessage(Session.getInstance(new

 

Properties()));

             

              //2、设置邮件的属性

             

              message.setFrom(new InternetAddress("redarmycsdn@sina.com"));

              message.setRecipient(Message.RecipientType.TO, new InternetAddress

 

("xx@sina.com"));

              message.setSubject("世界上最复杂的邮件");

             

              //3、设置正文

              MimeBodyPart text = new MimeBodyPart();

              text.setContent("xxxxxxx<br/><img

 

src='cid:xx.jpg'><br/>xxxxxx","text/html;charset=gb2312");

      

              //4、设置图片

              MimeBodyPart image = new MimeBodyPart();

              DataHandler dh = new DataHandler(new FileDataSource("src//f.jpg"));

              image.setDataHandler(dh);

              image.setContentID("xx.jpg");

             

             

              //5、设置附件

              MimeBodyPart attch = new MimeBodyPart();

              DataHandler dh1 = new DataHandler(new FileDataSource("src//

 

.mp3"));

              attch.setDataHandler(dh1);

              String filename = dh1.getName();

              attch.setFileName(MimeUtility.encodeText(filename));

             

             

              //描述关系

             

              //图片与正文的描述关系

              MimeMultipart mm = new MimeMultipart();

              mm.addBodyPart(text);

              mm.addBodyPart(image);

              mm.setSubType("related");

             

              //图片与正文的 bodypart

              MimeBodyPart part = new MimeBodyPart();

              part.setContent(mm);

             

              //附件与以上的bodypart关系

              MimeMultipart m = new MimeMultipart();

              m.addBodyPart(part);

              m.addBodyPart(attch);

              m.setSubType("mixed");

             

              //MIME消息设置到message

              message.setContent(m);

             

              message.saveChanges();

              message.writeTo(new FileOutputStream("d://66.eml"));

             

             

             

             

             

      

       }

      

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值