第二讲:使用JavaMail表示MIME消息(2)
在第二讲的第一部分主要讲解了MIME在JavaMail中如何表示以及使用MimeMessage进行创建纯文本和HTML类邮件的讲解。下面将会讲解如何使用MimeBodyPart和MimeMultipart等类创建含有组合消息、附件等较复杂的邮件。
一、MimeBodyPart类
javax.mail.internet.MimeBodyPart类 表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。
下面介绍一下常用的函数:
MimeBodyPart() MimeBodyPart(java.io.InputStream is) | is参数表示从输入流中读取数据,并使用读取到的数据填充MimeBodyPart实例对象 |
setDDataHandler(javax.activation.DataHandler dh) | 设置该对象后,MimeBodyPart在生成具体的MIME消息时会调用该对象的方法获取所需要的数据信息。DataHandler是JAF中定义的一个类,是一种数据访问接口,可以读取各种数据源中的数据和返回数据源的MIME类型。 |
setContentID(java.lang.String cid) | 设置消息头中的“Content-ID”头字段 |
setDisposition(java,lang.String disposition) | 设置消息头中的"Content-Disposition"字段,如果当前MIME消息作为邮件中的附件部分,那么可以使用这个方法设置。 |
setFileName(java.lang.String filename) | 常用于设置邮件附件名,即设置”Content-Disposition“中filename参数 |
javax.mail.internet.MimeMultipart是抽象类 Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。
其主要函数有:
Mimemultipart() MimeMultipart(java.lang.String type) | 缺省类型时"multipart/mixed"即 Mimemultipart对象代表的组合MIME消息的Content-Type属性值为"multipart/mixed",其他类型包括"multipart/related","multipart/alternative" |
addBodyPart(BodyPart bp) addBodyPart(BodyPart bp, int index) | 新增一个BodyPart对象到Mimemultipart对象中,其位置位于原有的Mimemultipart对象列表的尾部,用index指定新增的BodyPart插入的位置 |
setSubType(java.lang.String type) | 用于设置Content-Type中MIME的子类型, 有:"mixed","related",”alternative" |
getContentType():String | 返回Content-Type类型 |
getBodyPart(int index) getBodyPart(java.lang.String cid) | 返回Mimemultipart对象中位于index位置或为cid的BodyPart对象 |
getCount():int | 返回Mimemultipart对象中保存的BodyPart对象的个数 |
下面图是用来显示MIME中各个对象将的组合关系:
三、应用举例
例一:创建包含内嵌图片的邮件
前面的例子中是单独的使用HTML或者是纯文本内容,但是有时候我们需要在纯文本中使用内嵌的方式显示一些图片,因此就要将纯文本和内嵌图片单独存放在MimeBodyPart中然后再将其存放在一个Mimemultipart对象中即可。
String from = "lucas@sina.com";
String to= "sacul@163.com,chidlk@gmai.com";
String body = "<h4>欢迎大家阅读邮件</h4>"
+"<a href = \"http://blog.csdn.net/wenwen1538\">欢迎访问我的主页</a>";
String subject = "HTML邮件";
Properties props = new Properties();
Session session = Session.getInstance(props);
Message msg= new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipients(RecipientType.TO, InternetAddress.parse(to));
msg.setSubject(subject);
msg.setSentDate(new Date());
//创建一个子类型为"related"的Mimemultipart对象
MimeMultipart multipart = new MimeMultipart("related");
//创建一个HTML正文的MimeBodyPart对象,并将其加载到Mimemultipart对象中
MimeBodyPart htmlBodyPart = new MimeBodyPart();
htmlBodyPart.setContent(body, "text/html; charset=gb2312");
multipart.addBodyPart(htmlBodyPart);
//创建一个图片内容的MimeBodyPart对象并将其加入前面创建的Mimemultipart对象中
MimeBodyPart imgBodyPart = new MimeBodyPart();
FileDataSource fds = new FileDataSource("D:\\蜗牛的世界.png");
imgBodyPart.setDataHandler(new DataHandler(fds));
imgBodyPart.setContentID("uind--woniu--png-001");
// imgBodyPart.setHeader("Content-ID", "uind--woniu--png-001");
/**
* 不需要使用下面的语句来设置图片的MIME类型,因为JAF框架中的DataSource对象可以返回数据源的MIME类型,
* 因此上面的setDataHandler()可以设置MIME类型
*/
// imgBodyPart.setHeader("Content-Type", "image/gif");
multipart.addBodyPart(imgBodyPart);
//将multipart对象设置为整个邮件的内容,要使用saveChanges进行更新
msg.setContent(multipart);
msg.saveChanges();
//将对象写入文件中
msg.writeTo(new FileOutputStream("d:\\test.eml"));
例二:创建有内嵌图片、附件(普通文件、声音)的组合复杂邮件
public static void main(String[] args) throws AddressException, MessagingException, FileNotFoundException, IOException {
String from = "lucas@sina.com";
String to= "sacul@163.com, chidlk@gmai.com";
String body = "<h4>欢迎大家阅读邮件</h4>"
+"<a href = \"http://blog.csdn.net/wenwen1538\">欢迎访问我的主页</a>";
String subject = "HTML邮件";
Properties props = new Properties();
Session session = Session.getInstance(props);
Message msg= new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipients(RecipientType.TO, InternetAddress.parse(to));
msg.setSubject(subject);
msg.setSentDate(new Date());
//创建代表邮件正文和附件的各个对象
MimeBodyPart contentPart = createContent(body, "D:\\蜗牛的世界.png");
MimeBodyPart attactment1 = createAttachment("D:\\create.sql");
MimeBodyPart attachment2 = createAttachment("D:\\TTPmusic\\Maroon 5 - One More Night.mp3");
//下面组合邮件正文和附件的Mimemultipart对象
MimeMultipart allMultipart = new MimeMultipart("mixed");
allMultipart.addBodyPart(contentPart);
allMultipart.addBodyPart(attactment1);
allMultipart.addBodyPart(attachment2);
//将multipart对象设置为整个邮件的内容,要使用saveChanges进行更新
msg.setContent(allMultipart);
msg.saveChanges();
//将对象写入文件中
msg.writeTo(new FileOutputStream("d:\\test.eml"));
}
public static MimeBodyPart createContent(String body, String filename) throws MessagingException{
//创建一个MimeBodyPart对象存放Mimemultipart对象
MimeBodyPart contentBodyPart = new MimeBodyPart();
//创建一个子类型为"related"的Mimemultipart对象
MimeMultipart multipart = new MimeMultipart();
multipart.setSubType("related");
//创建一个HTML正文的MimeBodyPart对象,并将其加载到Mimemultipart对象中
MimeBodyPart htmlBodyPart = new MimeBodyPart();
htmlBodyPart.setContent(body, "text/html; charset=gb2312");
multipart.addBodyPart(htmlBodyPart);
//创建一个图片内容的MimeBodyPart对象并将其加入前面创建的Mimemultipart对象中
MimeBodyPart imgBodyPart = new MimeBodyPart();
FileDataSource fds = new FileDataSource(filename);
imgBodyPart.setDataHandler(new DataHandler(fds));
imgBodyPart.setContentID("uind--woniu--png-001");
multipart.addBodyPart(imgBodyPart);
//将Mimemultipart对象加入到MimeBodyPart对象中
contentBodyPart.setContent(multipart);
return contentBodyPart;
}
public static MimeBodyPart createAttachment(String filename) throws MessagingException{
//创建保存附件的MimeBodyPart对象,并且加入附件内容和相应的信息
MimeBodyPart attachmentPart = new MimeBodyPart();
FileDataSource fds = new FileDataSource(filename);
attachmentPart.setDataHandler(new DataHandler(fds));
attachmentPart.setFileName(fds.getName());
return attachmentPart;
}