创建内含附件、图文并茂的邮件
下面是代码结构中3个重要的方法:
MimeBodyPart createAttachment(String fileName) 方法用于创建附件并返回;
MimeBodyPart createContent(String body, String fileName) 方法用于创建正文部分并返回;
MimeMessage createMessage(Session session) 方法用于调用上面的两个方法生成邮件。
其实,创建一个内含附件的邮件与上一篇文章中创建正文中包含图片的邮件的原理,甚至代码都几乎相同。也就是使用 JAF 框架中的 FileDataSource 类和 DataHandler 类来获得给定路径的资源文件,JAF 框架中的这两个类共同协作可以获知文件所属的 MIME 类型,它们会正确地添加到邮件组织结构中的对应消息头中。
不同的是:
在 HTML 格式的正文中内含图片是使用 MimeBody.setContentID() 方法设置对应的资源文件的唯一标识符,即 MIME 协议对于邮件的结构组织格式中的 Content-ID 头字段;
而在 MIME 邮件中添加附件是使用 MimeBodyPart.setFileName() 方法来关联 FileSourceData 对象指向的资源文件。
程序代码:
这个不同点在下面代码中会用橙色背景强调指出,代码如下:
- importjava.io.FileOutputStream;
- importjava.util.Properties;
- importjavax.activation.DataHandler;
- importjavax.activation.FileDataSource;
- importjavax.mail.Message;
- importjavax.mail.Session;
- importjavax.mail.internet.InternetAddress;
- importjavax.mail.internet.MimeBodyPart;
- importjavax.mail.internet.MimeMessage;
- importjavax.mail.internet.MimeMultipart;
- /**
- *创建内含附件、图文并茂的邮件
- *@authorhaolloyin
- */
- publicclassWithAttachmentMessage{
- /**
- *根据传入的文件路径创建附件并返回
- */
- publicMimeBodyPartcreateAttachment(StringfileName)throwsException{
- MimeBodyPartattachmentPart=newMimeBodyPart();
- FileDataSourcefds=newFileDataSource(fileName);
- attachmentPart.setDataHandler(newDataHandler(fds));
- attachmentPart.setFileName(fds.getName());
- returnattachmentPart;
- }
- /**
- *根据传入的邮件正文body和文件路径创建图文并茂的正文部分
- */
- publicMimeBodyPartcreateContent(Stringbody,StringfileName)
- throwsException{
- //用于保存最终正文部分
- MimeBodyPartcontentBody=newMimeBodyPart();
- //用于组合文本和图片,"related"型的MimeMultipart对象
- MimeMultipartcontentMulti=newMimeMultipart("related");
- //正文的文本部分
- MimeBodyParttextBody=newMimeBodyPart();
- textBody.setContent(body,"text/html;charset=gbk");
- contentMulti.addBodyPart(textBody);
- //正文的图片部分
- MimeBodyPartjpgBody=newMimeBodyPart();
- FileDataSourcefds=newFileDataSource(fileName);
- jpgBody.setDataHandler(newDataHandler(fds));
- jpgBody.setContentID("logo_jpg");
- contentMulti.addBodyPart(jpgBody);
- //将上面"related"型的MimeMultipart对象作为邮件的正文
- contentBody.setContent(contentMulti);
- returncontentBody;
- }
- /**
- *根据传入的Seesion对象创建混合型的MIME消息
- */
- publicMimeMessagecreateMessage(Sessionsession)throwsException{
- Stringfrom=[email protected];
- Stringto="[email protected]";
- Stringsubject="创建内含附件、图文并茂的邮件!";
- Stringbody="<h4>内含附件、图文并茂的邮件测试!!!</h4></br>"
- +"<ahref=http://haolloyin.blog.51cto.com/>蚂蚁</a></br>"
- +"<imgsrc=\"cid:logo_jpg\"></a>";
- MimeMessagemsg=newMimeMessage(session);
- msg.setFrom(newInternetAddress(from));
- msg.setRecipient(Message.RecipientType.TO,newInternetAddress(to));
- msg.setSubject(subject);
- //创建邮件的各个MimeBodyPart部分
- MimeBodyPartattachment01=createAttachment("F:\\java\\Snake.java");
- MimeBodyPartattachment02=createAttachment("F:\\java\\meng.mp3");
- MimeBodyPartcontent=createContent(body,"F:\\java\\logo.jpg");
- //将邮件中各个部分组合到一个"mixed"型的MimeMultipart对象
- MimeMultipartallPart=newMimeMultipart("mixed");
- allPart.addBodyPart(attachment01);
- allPart.addBodyPart(attachment02);
- allPart.addBodyPart(content);
- //将上面混合型的MimeMultipart对象作为邮件内容并保存
- msg.setContent(allPart);
- msg.saveChanges();
- returnmsg;
- }
- //测试生成邮件
- publicstaticvoidmain(String[]args)throwsException{
- WithAttachmentMessagemail=newWithAttachmentMessage();
- Sessionsession=Session.getDefaultInstance(newProperties());
- MimeMessagemessage=mail.createMessage(session);
- message.writeTo(newFileOutputStream("withAttachmentMail.eml"));
- }
- }
编译、运行生成 withAttachmentMail.eml 文件,双击打开,如下图:
看看上面用 Outlook 打开生成的文件,在附件栏里面就有一个 .java 源文件和一首 MP3 文件了。
打开邮件的原始内容:
查看生成的邮件的原始内容,点击“文件”、“属性”、“邮件来源”或者使用 EditPlus 、UltraEdit 等文本编辑器直接打开也行,下面是原始内容:
- From:[email protected]
- To:[email protected]
- Message-ID:<56667.2.1279677956578.JavaMail.Administrator@WWW-1477FF1578B>
- Subject:=?GBK?B?tLS9qMTauqy4vbz+oaLNvM7EsqLDr7XE08q8/qOh?=
- MIME-Version:1.0
- Content-Type:multipart/mixed;
- boundary="----=_Part_1_13249998.1279677956546"
- ------=_Part_1_13249998.1279677956546
- Content-Type:application/octet-stream;name=Snake.java
- Content-Transfer-Encoding:base64
- Content-Disposition:attachment;filename=Snake.java
- //省略被BASE64转码后的Snake.java附件内容
- ------=_Part_1_13249998.1279677956546
- Content-Type:application/octet-stream;name=meng.mp3
- Content-Transfer-Encoding:base64
- Content-Disposition:attachment;filename=meng.mp3
- //省略被BASE64转码后的meng.java附件内容
- ------=_Part_1_13249998.1279677956546
- Content-Type:multipart/related;
- boundary="----=_Part_0_3373112.1279677956546"
- ------=_Part_0_3373112.1279677956546
- Content-Type:text/html;charset=gbk
- Content-Transfer-Encoding:quoted-printable
- <h4>=C4=DA=BA=AC=B8=BD=BC=FE=A1=A2=CD=BC=CE=C4=B2=A2=C3=AF=B5=C4=D3=CA=BC=
- =FE=B2=E2=CA=D4=A3=A1=A3=A1=A3=A1</h4></br><ahref=3Dhttp://haolloyin.bl=
- og.51cto.com/>=C2=EC=D2=CF</a></br><imgsrc=3D"cid:logo_jpg"></a>
- ------=_Part_0_3373112.1279677956546
- Content-Type:image/jpeg
- Content-Transfer-Encoding:base64
- Content-ID:logo_jpg
- //省略被BASE64转码后的邮件正文部分内嵌的.jpg图片的内容
- ------=_Part_0_3373112.1279677956546--
- ------=_Part_1_13249998.1279677956546--
重要部分已经用背景颜色指出来了,有兴趣的可以深入了解一下 MIME 协议对邮件结构组织的规范格式。