邮件原理
1创建邮件—— MIME协议
MIME协议是对RFC822文档的升级和补充,它描述了如何生成一封复杂邮件。通常我们把MIME协议描述的邮件称之为MIME邮件,MIME协议描述的数据称之为MIME消息。
对于一封复杂邮件,如果包含了多个不同的数据,MIME协议规定了要使用分隔线对多段数据进行分隔,并使用Content-Type头字段对数据的类型、以及多个数据之间的关系进行描述。(查看outlook邮件源文件)
2 MIME协议常用头字段
(1)Content-type:字段
数据类型
以“主类型/子类型”的形式出现,主类型有text、image、audio、video、application、message等,分别表示文本、图片、音频、视频、应用程序、组合结构、消息等。每个主类型下面都有多个子类型,例如text主类型包含plain、html、xml、css等子类型。
数据的关系
multipart/mixed、multipart/related、multipart/alternative
(2)Content-Disposition头字段
Content-Disposition头字段用于指定邮件阅读程序处理数据内容的方式,有inline和attachment两种标准方式,inline表示直接处理,而attachment表示当作附件处理。如果将Content-Disposition设置为attachment,在其后还可以指定filename属性,如下所示:
Content-Disposition: attachment; filename=“1.bmp”
上面的MIME头字段表示MIME消息体的内容为邮件附件,附件名“1.bmp”
(3)Content-ID头字段
Content-ID头字段用于为“multipart/related”组合消息中的内嵌资源指定一个唯一标识号,在HTML格式的正文中可以使用这个唯一标识号来引用该内嵌资源。例如,假设将一个表示内嵌图片的MIME消息的Content-ID头字段设置为如下形式:
Content-ID: it315logo_gif
那么,在HTML正文中就需要使用如下HTML语句来引用该图片资源:
<img src="cid:it315logo_gif">
注意,在引用Content-ID头字段标识的内嵌资源时,要在资源的唯一标识号前面加上“cid:”,以说明要采用唯一标识号对资源进行引用。
3邮件组织结构相关的API
MimeMessage类表示整封邮件。
MimeBodyPart类表示邮件的一个MIME消息。
MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。
4.实例
(1)邮件只发送内容
public class MimeMail {
public static void main(String[] args) throws Exception {
//创建邮件
MimeMessage message=new MimeMessage(Session.getInstance(new Properties()));
//设置邮件属性
message.setFrom(new InternetAddress("aa@hai.com"));
message.setRecipients(Message.RecipientType.TO, "bb@hai.com");
message.setSubject("haiyan");
//正文
MimeBodyPart part=new MimeBodyPart();
part.setContent("haoa你好","text/html");
//描述关系
MimeMultipart mm=new MimeMultipart();
mm.addBodyPart(part);
message.setContent(mm);
message.saveChanges();
message.writeTo(new FileOutputStream("D://1.eml"));
}
}
(2)邮件发送内容和一张图片
public class MimeImageMail {
public static void main(String[] args) throws Exception {
//创建邮件
MimeMessage message=new MimeMessage(Session.getInstance(new Properties()));
//设置邮件属性
message.setFrom(new InternetAddress("wang@qq.com"));
message.setRecipient(Message.RecipientType.TO, new InternetAddress("liu@qq.com"));
message.setSubject("给你发个美女的照片");
//正文
MimeBodyPart text=new MimeBodyPart();
text.setContent("哥你好啊,好好照顾自己<img src='cid:xx.jpg'>","text/html;charset=gb2312");
MimeBodyPart image=new MimeBodyPart();
image.setDataHandler(new DataHandler(new FileDataSource("src//f.jpg")));
image.setContentID("xx.jpg");;
MimeMultipart mm=new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.setSubType("related");
message.setContent(mm);
message.saveChanges();
message.writeTo(new FileOutputStream("D://2.eml"));
}
}
(3)邮件发送内容和多张图片
public class MimeManyMail {
public static void main(String[] args) throws Exception {
//创建邮件
MimeMessage message=new MimeMessage(Session.getInstance(new Properties()));
//设置邮件属性
message.setFrom(new InternetAddress("wang@qq.com"));
message.setRecipient(Message.RecipientType.TO,new InternetAddress("liu@qq.com"));
message.setSubject("看照片");
//正文
MimeBodyPart text=new MimeBodyPart();
text.setContent("好好看看,哪张漂亮啊<br/><img src='cid:xx.jpg'><br/><img src='cid:yy.jpg'><br/>你选哪个 ","text/html;charset=gb2312");
MimeBodyPart image=new MimeBodyPart();
image.setDataHandler(new DataHandler(new FileDataSource("src//f.jpg")));
image.setContentID("xx.jpg");
MimeBodyPart image2=new MimeBodyPart();
DataHandler dh=new DataHandler(new FileDataSource("src//美.jpg"));
image2.setDataHandler(dh);
image2.setContentID("yy.jpg");
String filename=dh.getName();
image2.setFileName(MimeUtility.encodeText(filename));
//描述关系
MimeMultipart mm=new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.addBodyPart(image2);
mm.setSubType("related");
message.setContent(mm);
message.saveChanges();
message.writeTo(new FileOutputStream("D://4.eml"));
}
}
(5)邮件发送内容和附件
public class AttchMime {
public static void main(String[] args) throws Exception {
//创建邮件
MimeMessage message=new MimeMessage(Session.getInstance(new Properties()));
//设置邮件属性
message.setFrom(new InternetAddress("yan@qq.com"));
message.setRecipient(Message.RecipientType.TO, new InternetAddress("shuai@qq.com"));
//正文
MimeBodyPart text=new MimeBodyPart();
text.setContent("给你发个美女的照片<br/><img src='cid:xx.jpg'>好看 不","text/html;charset=gb2312");
MimeBodyPart attch=new MimeBodyPart();
attch.setDataHandler(new DataHandler(new
FileDataSource("src//1.mp3")));
attch.setFileName("1.mp3");
//描述关系
MimeMultipart mm=new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(attch);
mm.setSubType("mixed");
message.setContent(mm);
message.saveChanges();
message.writeTo(new FileOutputStream("d://3.eml"));
}
}
(6)邮件发送内容、多个图片和附件
public class MailImageAndAttch{
public static void main(String[] args) throws Exception{
//创建邮件
MimeMessage message=new MimeMessage(Session.getInstance(new Properties()));
//设置邮件属性
message.setFrom(new InternetAddress("wang@qq.com"));
message.setRecipient(Message.RecipientType.TO, new InternetAddress("yong@qq.com"));
message.setSubject("复杂的邮件");
//正文
MimeBodyPart text=new MimeBodyPart();
text.setContent("我给你发两张图片<br/><img src='cid:xx.jpg'><br/><img src='cid:yy.jpg'>和一首歌 ","text/html;charset=gb2312");
MimeBodyPart image=new MimeBodyPart();
image.setDataHandler(new DataHandler(new FileDataSource("src//f.jpg")));
image.setContentID("xx.jpg");
MimeBodyPart image2=new MimeBodyPart();
DataHandler dh1=new DataHandler(new FileDataSource("src//美.jpg"));
image2.setDataHandler(dh1);
image2.setContentID("yy.jpg");
String filename=dh1.getName();
image2.setFileName(MimeUtility.encodeText(filename));
MimeBodyPart attch=new MimeBodyPart();
DataHandler dh=new DataHandler(new FileDataSource("src//默默无 语.mp3"));
attch.setDataHandler(dh);
String name=dh.getName();
attch.setFileName(MimeUtility.encodeText(name));
MimeMultipart mm=new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.addBodyPart(image2);
mm.setSubType("related");
MimeBodyPart part=new MimeBodyPart();
part.setContent(mm);
//描述关系
MimeMultipart m=new MimeMultipart();
m.addBodyPart(part);
m.addBodyPart(attch);
m.setSubType("mixed");
message.setContent(m);
message.saveChanges();
message.writeTo(new FileOutputStream("D://5.eml"));
}
}