我们常常在邮件中添加附件,以达到传输较大文件的目的。而上一篇文章只是将本机的一张图片内嵌到邮件的 HTML 格式的正文当中,这样的邮件显得不够丰富多彩。我们想要一封正文部分图文并茂,而游客附带若干附件的邮件。

下面是代码结构中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 对象指向的资源文件。

程序代码:

这个不同点在下面代码中会用橙色背景强调指出,代码如下:


1. importjava.io.FileOutputStream; 
2. importjava.util.Properties;  
3. 
4. importjavax.activation.DataHandler;  
5. importjavax.activation.FileDataSource;  
6. importjavax.mail.Message;  
7. importjavax.mail.Session;  
8. importjavax.mail.internet.InternetAddress;  
9. importjavax.mail.internet.MimeBodyPart;  
10. importjavax.mail.internet.MimeMessage;  
11. importjavax.mail.internet.MimeMultipart;  
12. 
13. /** 
14. *创建内含附件、图文并茂的邮件 
15. *@authorhaolloyin 
16. */
17. publicclassWithAttachmentMessage{  
18. 
19. /** 
20. *根据传入的文件路径创建附件并返回 
21. */
22. publicMimeBodyPartcreateAttachment(StringfileName)throwsException{  
23. newMimeBodyPart();  
24. newFileDataSource(fileName);  
25. newDataHandler(fds));  
26. attachmentPart.setFileName(fds.getName()); 
27. returnattachmentPart;  
28. } 
29. 
30. /** 
31. *根据传入的邮件正文body和文件路径创建图文并茂的正文部分 
32. */
33. publicMimeBodyPartcreateContent(Stringbody,StringfileName)  
34. throwsException{  
35. //用于保存最终正文部分 
36. newMimeBodyPart();  
37. //用于组合文本和图片,"related"型的MimeMultipart对象 
38. newMimeMultipart("related");  
39. 
40. //正文的文本部分 
41. newMimeBodyPart();  
42. "text/html;charset=gbk");  
43. contentMulti.addBodyPart(textBody); 
44. 
45. //正文的图片部分 
46. newMimeBodyPart();  
47. newFileDataSource(fileName);  
48. newDataHandler(fds));  
49. jpgBody.setContentID("logo_jpg");
50. contentMulti.addBodyPart(jpgBody); 
51. 
52. //将上面"related"型的MimeMultipart对象作为邮件的正文 
53. contentBody.setContent(contentMulti); 
54. returncontentBody;  
55. } 
56. 
57. /** 
58. *根据传入的Seesion对象创建混合型的MIME消息 
59. */
60. publicMimeMessagecreateMessage(Sessionsession)throwsException{  
61. test_hao@163.com;  
62. "test_hao@sina.cn";  
63. "创建内含附件、图文并茂的邮件!";  
64. "<h4>内含附件、图文并茂的邮件测试!!!</h4></br>"
65. "<ahref=http://haolloyin.blog.51cto.com/>蚂蚁</a></br>"
66. "<imgsrc=\"cid:logo_jpg\"></a>";  
67. 
68. newMimeMessage(session);  
69. newInternetAddress(from));  
70. newInternetAddress(to));  
71. msg.setSubject(subject); 
72. 
73. //创建邮件的各个MimeBodyPart部分 
74. "F:\\java\\Snake.java");  
75. "F:\\java\\meng.mp3");  
76. "F:\\java\\logo.jpg");  
77. 
78. //将邮件中各个部分组合到一个"mixed"型的MimeMultipart对象 
79. newMimeMultipart("mixed");  
80. allPart.addBodyPart(attachment01); 
81. allPart.addBodyPart(attachment02); 
82. allPart.addBodyPart(content); 
83. 
84. //将上面混合型的MimeMultipart对象作为邮件内容并保存 
85. msg.setContent(allPart); 
86. msg.saveChanges(); 
87. returnmsg;  
88. } 
89. 
90. //测试生成邮件 
91. publicstaticvoidmain(String[]args)throwsException{  
92. newWithAttachmentMessage();  
93. newProperties());  
94. MimeMessagemessage=mail.createMessage(session); 
95. newFileOutputStream("withAttachmentMail.eml"));  
96. } 
97. }

编译、运行生成 withAttachmentMail.eml 文件,双击打开,如下图:

eml文件包含的Excel附件_ci

eml文件包含的Excel附件_java_02

看看上面用 Outlook 打开生成的文件,在附件栏里面就有一个 .java 源文件和一首 MP3 文件了。

打开邮件的原始内容:

查看生成的邮件的原始内容,点击“文件”、“属性”、“邮件来源”或者使用 EditPlus 、UltraEdit 等文本编辑器直接打开也行,下面是原始内容:

1. From:test_hao@163.com 
2. To:test_hao@sina.cn 
3. <56667.2.1279677956578.JavaMail.Administrator@WWW-1477FF1578B>
4. Subject:=?GBK?B?tLS9qMTauqy4vbz+oaLNvM7EsqLDr7XE08q8/qOh?=  
5. MIME-Version:1.0 
6. Content-Type:multipart/mixed; 
7. boundary="----=_Part_1_13249998.1279677956546"
8. 
9. ------=_Part_1_13249998.1279677956546  
10. name=Snake.java  
11. Content-Transfer-Encoding:base64 
12. attachment;filename=Snake.java  
13. 
14. //省略被BASE64转码后的Snake.java附件内容 
15. 
16. ------=_Part_1_13249998.1279677956546  
17. name=meng.mp3  
18. Content-Transfer-Encoding:base64 
19. attachment;filename=meng.mp3  
20. 
21. //省略被BASE64转码后的meng.java附件内容 
22. 
23. ------=_Part_1_13249998.1279677956546  
24. Content-Type:multipart/related; 
25. boundary="----=_Part_0_3373112.1279677956546"
26. 
27. ------=_Part_0_3373112.1279677956546  
28. charset=gbk
29. Content-Transfer-Encoding:quoted-printable 
30. 
31. <h4>=C4=DA=BA=AC=B8=BD=BC=FE=A1=A2=CD=BC=CE=C4=B2=A2=C3=AF=B5=C4=D3=CA=BC=  
32. FE=B2=E2=CA=D4=A3=A1=A3=A1=A3=A1</h4></br><ahref=3Dhttp://haolloyin.bl=  
33. og.51cto.com/>=C2=EC=D2=CF</a></br><imgsrc=3D"cid:logo_jpg"></a>
34. ------=_Part_0_3373112.1279677956546  
35. Content-Type:image/jpeg 
36. Content-Transfer-Encoding:base64 
37. Content-ID:logo_jpg
38. 
39. //省略被BASE64转码后的邮件正文部分内嵌的.jpg图片的内容 
40. 
41. ------=_Part_0_3373112.1279677956546--  
42. 
43. ------=_Part_1_13249998.1279677956546--