创建邮件—— MIME协议
MIME协议是对RFC822文档的升级和补充,它描述了如何生成一封复杂邮件。通常我们把MIME协议描述的邮件称之为MIME邮件,MIME协议描述的数据称之为MIME消息。
对于一封复杂邮件,如果包含了多个不同的数据,MIME协议规定了要使用分隔线对多段数据进行分隔,并使用Content-Type头字段对数据的类型、以及多个数据之间的关系进行描述。(
• Content-type:字段
– 数据类型
• 以“主类型/子类型”的形式出现,主类型有text、image、audio、video、application、message等,分别表示文本、图片、音频、视频、应用程序、组合结构、消息等。每个主类型下面都有多个子类型,例如text主类型包含plain、html、xml、css等子类型。
– 数据的关系
– multipart/mixed、multipart/related、multipart/alternative
• Content-Disposition头字段
– Content-Disposition头字段用于指定邮件阅读程序处理数据内容的方式,有inline和attachment两种标准方式,inline表示直接处理,而attachment表示当作附件处理。如果将Content-Disposition设置为attachment,在其后还可以指定filename属性,如下所示:
Content-Disposition: attachment; filename=“1.bmp”
上面的MIME头字段表示MIME消息体的内容为邮件附件,附件名“1.bmp”
Content-Disposition: attachment; filename=“1.bmp”
上面的MIME头字段表示MIME消息体的内容为邮件附件,附件名“1.bmp”
• Content-ID头字段
– Content-ID头字段用于为“multipart/related”组合消息中的内嵌资源指定一个唯一标识号,在HTML格式的正文中可以使用这个唯一标识号来引用该内嵌资源。例如,假设将一个表示内嵌图片的MIME消息的Content-ID头字段设置为如下形式:
Content-ID: it315logo_gif
那么,在HTML正文中就需要使用如下HTML语句来引用该图片资源:
<img src="cid:it315logo_gif">
注意,在引用Content-ID头字段标识的内嵌资源时,要在资源的唯一标识号前面加上“cid:”,以说明要采用唯一标识号对资源进行引用。
Content-ID: it315logo_gif
那么,在HTML正文中就需要使用如下HTML语句来引用该图片资源:
<img src="cid:it315logo_gif">
注意,在引用Content-ID头字段标识的内嵌资源时,要在资源的唯一标识号前面加上“cid:”,以说明要采用唯一标识号对资源进行引用。
Message类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件。
Session类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session对象根据这些信息构建用于邮件收发的Transport和Store对象,以及为客户端创建Message对象时提供信息支持。



带一个附件和一个图片的关系原理如上图所示 : 首先把正文和图片以 MimeMultipart 中 related 的关系相联,然后把他们这个整体存入 MimeBodyPart 中当作正文再次和附件以 MimeMultipart 中 mixed 的关系相联.
下面是一个可运行的实例:
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
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;
publicclass AttchAndImgMail {
//JavaMail需要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机.
publicstaticvoid main(String[] args) throws Exception{
Properties properties = new Properties();
properties.put("mail.smtp.host", "smtp.qq.com");// 设置smtp主机
properties.put("mail.smtp.auth", "true");// 使用smtp身份验证
/*
* 在 JavaMail 中,可以通过 extends Authenticator 抽象类,在子类中覆盖父类中的 getPasswordAuthentication()
* 方法,就可以实现以不同的方式来进行登录邮箱时的用户身份认证。JavaMail 中的这种设计是使用了策略模式(Strategy
* */
* 在 JavaMail 中,可以通过 extends Authenticator 抽象类,在子类中覆盖父类中的 getPasswordAuthentication()
* 方法,就可以实现以不同的方式来进行登录邮箱时的用户身份认证。JavaMail 中的这种设计是使用了策略模式(Strategy
* */
MimeMessage message = new MimeMessage(Session.getInstance(properties,newAuthenticator() {
public PasswordAuthentication getPasswordAuthentication() {
returnnew PasswordAuthentication("发件人的QQ邮箱的帐号", "发件人的QQ邮箱密码");
}
}));
//设置邮件的属性
//设置邮件的发件人
message.setFrom(new InternetAddress("收件人的邮箱"));
//设置邮件的收件人 cc表示抄送 bcc 表示暗送
message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人邮箱"));
//设置邮件的主题
message.setSubject("世界上最复杂的邮件有附件和图片");
//创建邮件的正文
MimeBodyPart text = new MimeBodyPart();
// setContent(“邮件的正文内容”,”设置邮件内容的编码方式”)
text.setContent("世界上最复杂的邮件<img src='cid:a'>","text/html;charset=gb2312");
//创建图片
MimeBodyPart img = new MimeBodyPart();
/*JavaMail API不限制信息只为文本,任何形式的信息都可能作茧自缚MimeMessage的一部分.
* 除了文本信息,作为文件附件包含在电子邮件信息的一部分是很普遍的.
* JavaMail API通过使用DataHandler对象,提供一个允许我们包含非文本BodyPart对象的简便方法.*/
DataHandler dh = new DataHandler(new FileDataSource("src//你.jpg"));
img.setDataHandler(dh);
//创建图片的一个表示用于显示在邮件中显示
img.setContentID("a");
//创建附件
MimeBodyPart attch = new MimeBodyPart();
DataHandler dh1 = new DataHandler(new FileDataSource("src//大海.mp3"));
attch.setDataHandler(dh1);
String filename1 = dh1.getName();
// MimeUtility 是一个工具类,encodeText()用于处理附件字,防止中文乱码问题
attch.setFileName(MimeUtility.encodeText(filename1));
//关系 正文和图片的
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(img);
mm.setSubType("related");//设置正文与图片之间的关系
//图班与正文的 body
MimeBodyPart all = new MimeBodyPart();
all.setContent(mm);
//附件与正文(text 和 img)的关系
MimeMultipart mm2 = new MimeMultipart();
mm2.addBodyPart(all);
mm2.addBodyPart(attch);
mm2.setSubType("mixed");//设置正文与附件之间的关系
message.setContent(mm2);
message.saveChanges(); //保存修改
Transport.send(message);//发送邮件
}
}