Java程序中使用JavaMail發(fā)送帶圖片和附件的郵件
我們常常在郵件中添加附件,以達(dá)到傳輸較大文件的目的。而上一篇文章只是將本機(jī)的一張圖片內(nèi)嵌到郵件的 HTML 格式的正文當(dāng)中,這樣的郵件顯得不夠豐富多彩。我們想要一封正文部分圖文并茂,而游客附帶若干附件的郵件。
下面是代碼結(jié)構(gòu)中3個(gè)重要的方法:
- MimeBodyPart createAttachment(String fileName) 方法用于創(chuàng)建附件并返回;
- MimeBodyPart createContent(String body, String fileName) 方法用于創(chuàng)建正文部分并返回;
- MimeMessage createMessage(Session session) 方法用于調(diào)用上面的兩個(gè)方法生成郵件。
其實(shí),創(chuàng)建一個(gè)內(nèi)含附件的郵件與上一篇文章中創(chuàng)建正文中包含圖片的郵件的原理,甚至代碼都幾乎相同。也就是使用 JAF 框架中的 FileDataSource 類(lèi)和 DataHandler 類(lèi)來(lái)獲得給定路徑的資源文件,JAF 框架中的這兩個(gè)類(lèi)共同協(xié)作可以獲知文件所屬的 MIME 類(lèi)型,它們會(huì)正確地添加到郵件組織結(jié)構(gòu)中的對(duì)應(yīng)消息頭中。
不同的是:
在 HTML 格式的正文中內(nèi)含圖片是使用 MimeBody.setContentID() 方法設(shè)置對(duì)應(yīng)的資源文件的唯一標(biāo)識(shí)符,即 MIME 協(xié)議對(duì)于郵件的結(jié)構(gòu)組織格式中的 Content-ID 頭字段;
而在 MIME 郵件中添加附件是使用 MimeBodyPart.setFileName() 方法來(lái)關(guān)聯(lián) FileSourceData 對(duì)象指向的資源文件。
程序代碼:
這個(gè)不同點(diǎn)在下面代碼中會(huì)用橙色背景強(qiáng)調(diào)指出,代碼如下:
import java.io.FileOutputStream; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Message; import javax.mail.Session; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; /** * 創(chuàng)建內(nèi)含附件、圖文并茂的郵件 * @author haolloyin */ public class WithAttachmentMessage { /** * 根據(jù)傳入的文件路徑創(chuàng)建附件并返回 */ public MimeBodyPart createAttachment(String fileName) throws Exception { MimeBodyPart attachmentPart = new MimeBodyPart(); FileDataSource fds = new FileDataSource(fileName); attachmentPart.setDataHandler(new DataHandler(fds)); attachmentPart.setFileName(fds.getName()); return attachmentPart; } /** * 根據(jù)傳入的郵件正文body和文件路徑創(chuàng)建圖文并茂的正文部分 */ public MimeBodyPart createContent(String body, String fileName) throws Exception { // 用于保存最終正文部分 MimeBodyPart contentBody = new MimeBodyPart(); // 用于組合文本和圖片,"related"型的MimeMultipart對(duì)象 MimeMultipart contentMulti = new MimeMultipart("related"); // 正文的文本部分 MimeBodyPart textBody = new MimeBodyPart(); textBody.setContent(body, "text/html;charset=gbk"); contentMulti.addBodyPart(textBody); // 正文的圖片部分 MimeBodyPart jpgBody = new MimeBodyPart(); FileDataSource fds = new FileDataSource(fileName); jpgBody.setDataHandler(new DataHandler(fds)); jpgBody.setContentID("logo_jpg"); contentMulti.addBodyPart(jpgBody); // 將上面"related"型的 MimeMultipart 對(duì)象作為郵件的正文 contentBody.setContent(contentMulti); return contentBody; } /** * 根據(jù)傳入的 Seesion 對(duì)象創(chuàng)建混合型的 MIME消息 */ public MimeMessage createMessage(Session session) throws Exception { String from = test_hao@163.com; String to = "test_hao@sina.cn"; String subject = "創(chuàng)建內(nèi)含附件、圖文并茂的郵件!"; String body = "<h4>內(nèi)含附件、圖文并茂的郵件測(cè)試?。?!</h4> </br>" + "<a href = http://haolloyin.blog.51cto.com/> 螞蟻</a></br>" + "<img src = \"cid:logo_jpg\"></a>"; MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress(from)); msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); msg.setSubject(subject); // 創(chuàng)建郵件的各個(gè) MimeBodyPart 部分 MimeBodyPart attachment01 = createAttachment("F:\\java\\Snake.java"); MimeBodyPart attachment02 = createAttachment("F:\\java\\meng.mp3"); MimeBodyPart content = createContent(body, "F:\\java\\logo.jpg"); // 將郵件中各個(gè)部分組合到一個(gè)"mixed"型的 MimeMultipart 對(duì)象 MimeMultipart allPart = new MimeMultipart("mixed"); allPart.addBodyPart(attachment01); allPart.addBodyPart(attachment02); allPart.addBodyPart(content); // 將上面混合型的 MimeMultipart 對(duì)象作為郵件內(nèi)容并保存 msg.setContent(allPart); msg.saveChanges(); return msg; } // 測(cè)試生成郵件 public static void main(String[] args) throws Exception { WithAttachmentMessage mail = new WithAttachmentMessage(); Session session = Session.getDefaultInstance(new Properties()); MimeMessage message = mail.createMessage(session); message.writeTo(new FileOutputStream("withAttachmentMail.eml")); } }
編譯、運(yùn)行生成 withAttachmentMail.eml 文件,雙擊打開(kāi),如下圖:
看看上面用 Outlook 打開(kāi)生成的文件,在附件欄里面就有一個(gè) .java 源文件和一首 MP3 文件了。
打開(kāi)郵件的原始內(nèi)容:
查看生成的郵件的原始內(nèi)容,點(diǎn)擊“文件”、“屬性”、“郵件來(lái)源”或者使用 EditPlus 、UltraEdit 等文本編輯器直接打開(kāi)也行,下面是原始內(nèi)容:
From: test_hao@163.com To: test_hao@sina.cn 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 轉(zhuǎn)碼后的 Snake.java 附件內(nèi)容 ------=_Part_1_13249998.1279677956546 Content-Type: application/octet-stream; name=meng.mp3 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=meng.mp3 // 省略被 BASE64 轉(zhuǎn)碼后的 meng.java 附件內(nèi)容 ------=_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><a href =3D http://haolloyin.bl= og.51cto.com/> =C2=EC=D2=CF</a></br><img src =3D "cid:logo_jpg"></a> ------=_Part_0_3373112.1279677956546 Content-Type: image/jpeg Content-Transfer-Encoding: base64 Content-ID: logo_jpg // 省略被 BASE64 轉(zhuǎn)碼后的郵件正文部分內(nèi)嵌的 .jpg 圖片的內(nèi)容 ------=_Part_0_3373112.1279677956546-- ------=_Part_1_13249998.1279677956546--
重要部分已經(jīng)用背景顏色指出來(lái)了,有興趣的可以深入了解一下 MIME 協(xié)議對(duì)郵件結(jié)構(gòu)組織的規(guī)范格式。
- Java基于JavaMail實(shí)現(xiàn)向QQ郵箱發(fā)送郵件
- java中javamail發(fā)送帶附件的郵件實(shí)現(xiàn)方法
- java中javamail收發(fā)郵件實(shí)現(xiàn)方法
- JavaWeb中使用JavaMail實(shí)現(xiàn)發(fā)送郵件功能實(shí)例詳解
- 基于JavaMail的Java實(shí)現(xiàn)簡(jiǎn)單郵件發(fā)送功能
- 基于SSM框架+Javamail發(fā)送郵件的代碼實(shí)例
- Spring框架JavaMailSender發(fā)送郵件工具類(lèi)詳解
- Java使用JavaMail API發(fā)送和接收郵件的代碼示例
- JavaMail實(shí)現(xiàn)發(fā)送超文本(html)格式郵件的方法
- 輕松學(xué)會(huì)使用JavaMail?API發(fā)送郵件
相關(guān)文章
Spring Cloud Feign實(shí)現(xiàn)文件上傳下載的示例代碼
Feign框架對(duì)于文件上傳消息體格式并沒(méi)有做原生支持,需要集成模塊feign-form來(lái)實(shí)現(xiàn),本文就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下2022-02-02Java8函數(shù)式接口java.util.function速查大全
因?yàn)镴ava8引入了函數(shù)式接口,在java.util.function包含了幾大類(lèi)函數(shù)式接口聲明,這篇文章主要給大家介紹了關(guān)于Java8函數(shù)式接口java.util.function速查的相關(guān)資料,需要的朋友可以參考下2021-08-08java byte與base64的互轉(zhuǎn)的實(shí)現(xiàn)示例
在項(xiàng)目開(kāi)發(fā)中經(jīng)常用到,比如前端上送文件流(byte[])到后臺(tái)并轉(zhuǎn)成文件,本文主要介紹了java byte與base64的互轉(zhuǎn)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02SpringBoot下載文件遇到文件損壞等問(wèn)題解決方案
調(diào)用接口下載spring?boot工程的resources目錄下的excel模板文件,非常常見(jiàn)的一個(gè)文件下載功能,但是卻容易遇到很多坑,下面總結(jié)記錄下2023-10-10Java 基于AQS實(shí)現(xiàn)一個(gè)同步器
這篇文章主要介紹了如何基于AQS實(shí)現(xiàn)一個(gè)同步器,幫助大家更好的理解和學(xué)習(xí)Java并發(fā),感興趣的朋友可以了解下2020-09-09Java的動(dòng)態(tài)代理和靜態(tài)代理及反射常用API詳解
這篇文章主要介紹了Java的動(dòng)態(tài)代理和靜態(tài)代理及反射常用API詳解,動(dòng)態(tài)代理是一種在運(yùn)行時(shí)動(dòng)態(tài)生成代理對(duì)象的技術(shù),它是一種設(shè)計(jì)模式,用于在不修改原始對(duì)象的情況下,通過(guò)代理對(duì)象來(lái)間接訪(fǎng)問(wèn)原始對(duì)象,并在訪(fǎng)問(wèn)前后執(zhí)行額外的操作,需要的朋友可以參考下2024-01-01Java如何將字符串轉(zhuǎn)為數(shù)字int的三種方式詳析
這篇文章主要給大家介紹了關(guān)于Java如何將字符串轉(zhuǎn)為數(shù)字int的三種方式,在編程中我們經(jīng)常需要進(jìn)行各種數(shù)據(jù)類(lèi)型之間的轉(zhuǎn)換操作,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10