JavaMail开发3

创建邮件——RFC822文档

•RFC822文档规定了如何编写一封简单邮件
•邮件头和邮件体,两者使用空行分隔
•邮件头
•from字段
•to字段
•subject字段
•cc、bcc字段
•邮件体
•邮件内容
•缺点:RFC822文档漏洞能发送假冒邮件,现在不用了

创建邮件—— MIME协议 

      MIME协议是对RFC822文档的升级和补充,它描述了如何生成一封复杂邮件。通常我们把MIME协议描述的邮件称之为MIME邮件,MIME协议描述的数据称之为MIME消息

  对于一封复杂邮件,如果包含了多个不同的数据,MIME协议规定了要使用分隔线对多段数据进行分隔,并使用Content-Type头字段对数据的类型、以及多个数据之间的关系进行描述。

  (查看outlook邮件源文件)复杂邮件:文本+图片+附件

  1)简单邮件-文本

import java.io.FileOutputStream;
import java.util.Properties;
import javax.mail.Session;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

//基于MIME协议创建简单邮件
public class Demo1 {
	public static void main(String[] args) throws Exception {
		//创建一封邮件
		MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
		//设置From属性
		message.setFrom(new InternetAddress("aaa@hacket.cn"));
		//设置To属性
		message.setRecipient(RecipientType.TO,new InternetAddress("bbb@qq.cn"));
		//设置Subject属性
		message.setSubject("test");
		//设置Content属性
		message.setContent("Today is fine day","text/html;charset=ISO8859-1");
		//将该邮件保存的硬盘
		message.writeTo(new FileOutputStream("d:\\demo1.eml"));
	}
}
1 /*
2 MimeMessage:表示一个符合MIME协议的邮件
3 InternetAddress:表示电子邮件地址
4 RecipientType.TO:表示发送邮件的类型:例如TO(目标),CC(明抄送),BCC(密送)
5 简单邮件只含有文本
6 Content-Type:文本类型
7 
8 */

对于非Web应用,包冲突问题-JavaEE1.4-只针对于非Web应用,不用系统自带的jar包,自己加进去

|--mail.jar

|--activation.jar

MIME协议常用头字段

   1、Content-type:字段

   数据类型

    •以“主类型/子类型”的形式出现,主类型有text、image、audio、video、application、message等,分别表示文本、图片、音频、视频、应用程序、组合结构、消息等。
      每个主类型下面都有多个子类型,例如text主类型包含plain、html、xml、css等子类型。 
  数据的关系
•multipart/related图片、 multipart/mixed(附件)、
•multipart/form-data(上传文件)

   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:itcastlogo_gif">
注意,在引用Content-ID头字段标识的内嵌资源时,要在资源的唯一标识号前面加上“cid:”,以说明要采用唯一标识号对资源进行引用。

 邮件组织结构相关的API

MimeMessage类表示整封邮件。
MimeBodyPart类表示邮件的一个MIME消息。
MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。

   

   2)基于MIME协议创建复杂邮件(文本+图片)

import java.io.FileOutputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Session;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

//基于MIME协议创建复杂邮件(文本+图片)
public class Demo2 {
	public static void main(String[] args) throws Exception {
		
		//创建一封邮件
		MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
		
		//设置From属性
		message.setFrom(new InternetAddress("aaa@zhaojun.com"));
		
		//设置To属性
		message.setRecipient(RecipientType.TO,new InternetAddress("bbb@qq.com"));
		
		//设置Subject属性
		message.setSubject("text+image");
		
		//文本
		MimeBodyPart text = new MimeBodyPart();
		text.setContent("this is a <br/><img src='cid:imageID'/><br/>picture<br/>","text/html;charset=ISO8859-1");
		
		//图片
		MimeBodyPart image = new MimeBodyPart();
		//读取cc.JPG图片
		DataHandler dh = new DataHandler(new FileDataSource("src/cn/itcast/web/mail/config/cc.jpg"));
		//设置MimeBodyPart和DataHandler的关联
		image.setDataHandler(dh);
		//为图片设置一个唯一编号
		image.setContentID("imageID");
		
		//设置文本和图片的关系
		MimeMultipart mm = new MimeMultipart();
		mm.addBodyPart(text);
		mm.addBodyPart(image);
		mm.setSubType("related");
		
		//设置整个邮件的关系
		message.setContent(mm);
		
		//将该邮件保存的硬盘
		message.writeTo(new FileOutputStream("d:\\demo2.eml"));
		
	}
}
1 /*
2 MimeBodyPart:表示复杂邮件的一个组成部分,它可以表示文本,附件,图片
3 DataHandler:表示可以读取图片或附件
4 MimeMultipart:表示二个邮件组成部分的关系,文本和图片的关系是"related"关系
5 Content-ID:表示图片的编号
6 
7 */

03)文本+附件

import java.io.FileOutputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Session;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

//基于MIME协议创建复杂邮件(文本+)附件
public class Demo3 {
	public static void main(String[] args) throws Exception {
		
		//创建一封邮件
		MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
		
		//设置From属性
		message.setFrom(new InternetAddress("aaa@zhaojun.com"));
		
		//设置To属性
		message.setRecipient(RecipientType.TO,new InternetAddress("bbb@qq.com"));
		
		//设置Subject属性
		message.setSubject("text+append");
		
		//文本
		MimeBodyPart text = new MimeBodyPart();
		text.setContent("this is a append<br/>","text/html;charset=ISO8859-1");
		
		//附件1
		MimeBodyPart append1 = new MimeBodyPart();
		DataHandler dh = new DataHandler(new FileDataSource("src/cn/itcast/web/mail/config/apache-tomcat-7.0.12.zip"));
		append1.setDataHandler(dh);
		//设置附件的名字
		append1.setFileName(dh.getName());

		/*附件2
		MimeBodyPart append2 = new MimeBodyPart();
		dh = new DataHandler(new FileDataSource("src/cn/itcast/web/mail/config/apache-tomcat-6.0.29.zip"));
		append2.setDataHandler(dh);
		//设置附件的名字
		append2.setFileName(dh.getName());
		*/
		
		//设置文本和附件的关系
		MimeMultipart mm = new MimeMultipart();
		mm.addBodyPart(text);
		mm.addBodyPart(append1);
		//mm.addBodyPart(append2);
		mm.setSubType("mixed");

		//设置整个邮件的关系
		message.setContent(mm);
		
		//将该邮件保存的硬盘
		message.writeTo(new FileOutputStream("d:\\demo3.eml"));
		
	}
}
1 MimeMultipart:表示二个邮件组成部分的关系,文本和附件的关系是"mixed"关系,即默认
2         MimeMultipart加入的顺利与邮件显示附件的顺序无关

 04)文本+图片+附件

import java.io.FileOutputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Session;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

//基于MIME协议创建复杂邮件(1文本+1图片+1附件)
public class Demo4 {
	
	public static void main(String[] args) throws Exception {
		
		//创建一封邮件
		MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
		
		//设置From属性
		message.setFrom(new InternetAddress("aaa@zhaojun.com"));
		
		//设置To属性
		message.setRecipient(RecipientType.TO,new InternetAddress("bbb@qq.com"));
		
		//设置Subject属性
		message.setSubject("text+image+append");
		
		//文本
		MimeBodyPart text = new MimeBodyPart();
		text.setContent("this is a<br/><img src='cid:imageID'/><br/>image<br/>","text/html;charset=ISO8859-1");
		
		//图片
		MimeBodyPart image = new MimeBodyPart();
		DataHandler dh = new DataHandler(new FileDataSource("src/cn/itcast/web/mail/config/cc.jpg"));
		image.setDataHandler(dh);
		image.setContentID("imageID");
		
		//附件
		MimeBodyPart append = new MimeBodyPart();
		dh = new DataHandler(new FileDataSource("src/cn/itcast/web/mail/config/abc.txt"));
		append.setDataHandler(dh);
		append.setFileName(dh.getName());
		
		//文本+图片
		MimeMultipart mm1 = new MimeMultipart();
		mm1.addBodyPart(text);
		mm1.addBodyPart(image);
		mm1.setSubType("related");

		//将文本+图片封装成邮件的组成部分,即将关系看作成一个部分
		MimeBodyPart temp = new MimeBodyPart();
		temp.setContent(mm1);
		
		//设置和附件的关系
		MimeMultipart mm = new MimeMultipart();
		mm.addBodyPart(temp);
		mm.addBodyPart(append);
		mm.setSubType("mixed");
		
		//设置整个邮件的关系
		message.setContent(mm);
		
		//将该邮件保存的硬盘
		message.writeTo(new FileOutputStream("d:\\demo4.eml"));
		
	}
}
1 //对于,复杂类型的邮件,位置关系特别注意和加入的顺利要一致
原文地址:https://www.cnblogs.com/hacket/p/3044103.html