JavaMail:创建内含附件、图文并茂的邮件

本文介绍如何使用Java邮件框架JAF创建一封包含附件和图文内容的邮件,详细展示了创建邮件正文和附件的方法,以及如何将它们整合进邮件中。通过示例代码演示了邮件的创建过程,并提供了生成邮件的完整代码,使得读者能够轻松理解并实践邮件的发送。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

出处:http://haolloyin.blog.51cto.com/1177454/354137


我们常常在邮件中添加附件,以达到传输较大文件的目的。而上一篇文章只是将本机的一张图片内嵌到邮件的 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. import java.io.FileOutputStream;  

  2. import java.util.Properties;  

  3. import javax.activation.DataHandler;  

  4. import javax.activation.FileDataSource;  

  5. import javax.mail.Message;  

  6. import javax.mail.Session;  

  7. import javax.mail.internet.InternetAddress;  

  8. import javax.mail.internet.MimeBodyPart;  

  9. import javax.mail.internet.MimeMessage;  

  10. import javax.mail.internet.MimeMultipart;  

  11. /** 

  12.  * 创建内含附件、图文并茂的邮件 

  13.  * @author haolloyin 

  14.  */

  15. publicclass WithAttachmentMessage {  

  16. /** 

  17.      * 根据传入的文件路径创建附件并返回 

  18.      */

  19. public MimeBodyPart createAttachment(String fileName) throws Exception {  

  20.         MimeBodyPart attachmentPart = new MimeBodyPart();  

  21.         FileDataSource fds = new FileDataSource(fileName);  

  22.         attachmentPart.setDataHandler(new DataHandler(fds));  

  23.         attachmentPart.setFileName(fds.getName()); 

  24.         return attachmentPart;  

  25.     }  

  26. /** 

  27.      * 根据传入的邮件正文body和文件路径创建图文并茂的正文部分 

  28.      */

  29. public MimeBodyPart createContent(String body, String fileName)  

  30. throws Exception {  

  31.       // 用于保存最终正文部分 

  32.         MimeBodyPart contentBody = new MimeBodyPart();  

  33.       // 用于组合文本和图片,"related"型的MimeMultipart对象 

  34.         MimeMultipart contentMulti = new MimeMultipart("related");  

  35.       // 正文的文本部分 

  36.         MimeBodyPart textBody = new MimeBodyPart();  

  37.         textBody.setContent(body, "text/html;charset=gbk");  

  38.         contentMulti.addBodyPart(textBody);  

  39.       // 正文的图片部分 

  40.         MimeBodyPart jpgBody = new MimeBodyPart();  

  41.         FileDataSource fds = new FileDataSource(fileName);  

  42.         jpgBody.setDataHandler(new DataHandler(fds));  

  43.       jpgBody.setContentID("logo_jpg");

  44.         contentMulti.addBodyPart(jpgBody);  

  45.       // 将上面"related"型的 MimeMultipart 对象作为邮件的正文 

  46.         contentBody.setContent(contentMulti);  

  47.       return contentBody;  

  48.     }  

  49. /** 

  50.      * 根据传入的 Seesion 对象创建混合型的 MIME消息 

  51.      */

  52. public MimeMessage createMessage(Session session) throws Exception {  

  53.         String from = test_hao@163.com;  

  54.         String to = "test_hao@sina.cn";  

  55.         String subject = "创建内含附件、图文并茂的邮件!";  

  56.         String body = "<h4>内含附件、图文并茂的邮件测试!!!</h4> </br>"

  57.                 + "<a href = http://haolloyin.blog.51cto.com/> 蚂蚁</a></br>"

  58.                 + "<img src = "cid:logo_jpg"></a>";  

  59.         MimeMessage msg = new MimeMessage(session);  

  60.         msg.setFrom(new InternetAddress(from));  

  61.         msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));  

  62.         msg.setSubject(subject);  

  63.       // 创建邮件的各个 MimeBodyPart 部分 

  64.         MimeBodyPart attachment01 = createAttachment("F:javaSnake.java");  

  65.         MimeBodyPart attachment02 = createAttachment("F:javameng.mp3");  

  66.         MimeBodyPart content = createContent(body, "F:javalogo.jpg");  

  67.       // 将邮件中各个部分组合到一个"mixed"型的 MimeMultipart 对象 

  68.         MimeMultipart allPart = new MimeMultipart("mixed");  

  69.         allPart.addBodyPart(attachment01);  

  70.         allPart.addBodyPart(attachment02);  

  71.         allPart.addBodyPart(content);  

  72.       // 将上面混合型的 MimeMultipart 对象作为邮件内容并保存 

  73.         msg.setContent(allPart);  

  74.         msg.saveChanges();  

  75.       return msg;  

  76.     }  

  77. // 测试生成邮件 

  78. publicstaticvoid main(String[] args) throws Exception {  

  79.         WithAttachmentMessage mail = new WithAttachmentMessage();  

  80.         Session session = Session.getDefaultInstance(new Properties());  

  81.         MimeMessage message = mail.createMessage(session);  

  82.         message.writeTo(new FileOutputStream("withAttachmentMail.eml"));  

  83.     }  

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




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

打开邮件的原始内容:

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

 
  1. From: test_hao@163.com

  2. To: test_hao@sina.cn  

  3. Message-ID: <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. ------=_Part_1_13249998.1279677956546  

  9. Content-Type: application/octet-stream; name=Snake.java  

  10. Content-Transfer-Encoding: base64  

  11. Content-Disposition: attachment; filename=Snake.java  

  12. // 省略被 BASE64 转码后的 Snake.java 附件内容  

  13. ------=_Part_1_13249998.1279677956546  

  14. Content-Type: application/octet-stream; name=meng.mp3  

  15. Content-Transfer-Encoding: base64  

  16. Content-Disposition: attachment; filename=meng.mp3  

  17. // 省略被 BASE64 转码后的 meng.java 附件内容  

  18. ------=_Part_1_13249998.1279677956546  

  19. Content-Type: multipart/related;   

  20. boundary="----=_Part_0_3373112.1279677956546"

  21. ------=_Part_0_3373112.1279677956546  

  22. Content-Type: text/html;charset=gbk

  23. Content-Transfer-Encoding: quoted-printable 

  24. <h4>=C4=DA=BA=AC=B8=BD=BC=FE=A1=A2=CD=BC=CE=C4=B2=A2=C3=AF=B5=C4=D3=CA=BC=  

  25. =FE=B2=E2=CA=D4=A3=A1=A3=A1=A3=A1</h4></br><ahref =3D http://haolloyin.bl=  

  26. og.51cto.com/> =C2=EC=D2=CF</a></br><imgsrc =3D "cid:logo_jpg"></a>

  27. ------=_Part_0_3373112.1279677956546  

  28. Content-Type: image/jpeg  

  29. Content-Transfer-Encoding: base64  

  30. Content-ID: logo_jpg

  31. // 省略被 BASE64 转码后的邮件正文部分内嵌的 .jpg 图片的内容  

  32. ------=_Part_0_3373112.1279677956546--  

  33. ------=_Part_1_13249998.1279677956546-- 

重要部分已经用背景颜色指出来了,有兴趣的可以深入了解一下 MIME 协议对邮件结构组织的规范格式。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值