创建邮件—— 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;
public
class
AttchAndImgMail {
//JavaMail
需要
Properties
来创建一个
session
对象。它将寻找字符串
"mail.smtp.host"
,属性值就是发送邮件的主机
.
public
static
void
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,
new
Authenticator()
{
public
PasswordAuthentication
getPasswordAuthentication()
{
return
new
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);
//
发送邮件
}
}