JavaMail實現(xiàn)帶附件的郵件發(fā)送
本文實例為大家分享了JavaMail實現(xiàn)帶附件的郵件發(fā)送的具體代碼,供大家參考,具體內(nèi)容如下
發(fā)送純文本的郵件
package com.haiwen.test; ? import java.util.Date; import java.util.Properties; ? import javax.mail.Message.RecipientType; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; ? import org.junit.Test; ? public class MessageDemo1 { ? ?? ?@Test ?? ?public void testSend() throws Exception { ? ?? ??? ?// 0. 郵件參數(shù) ?? ??? ?Properties prop = new Properties(); ?? ??? ?prop.put("mail.transport.protocol", "smtp"); // 協(xié)議 ?? ??? ?prop.put("mail.smtp.host", "smtp.163.com"); // 主機(jī) ?? ??? ?// prop.put("mail.smtp.port", 25); // 端口 ?? ??? ?prop.put("mail.smtp.auth", "true"); // 用戶密碼認(rèn)證 ?? ??? ?prop.put("mail.debug", "true"); // 調(diào)試模式 ? ?? ??? ?// 1. 創(chuàng)建一個郵件的會話 ?? ??? ?Session session = Session.getDefaultInstance(prop); ?? ??? ?// 2. 創(chuàng)建郵件體對象 (整封郵件對象) ?? ??? ?MimeMessage message = new MimeMessage(session); ?? ??? ?// 3. 設(shè)置郵件體參數(shù): ?? ??? ?// 3.1 標(biāo)題 ?? ??? ?message.setSubject("我的第一封郵件"); ?? ??? ?// 3.2 郵件發(fā)送時間 ?? ??? ?message.setSentDate(new Date()); ?? ??? ?// 3.3 發(fā)件人 ?? ??? ?message.setSender(new InternetAddress("xxx@163.com")); ?? ??? ?// 3.4 接收人 ?? ??? ?message.setRecipient(RecipientType.TO, new InternetAddress("xxx.com")); ?? ??? ?// 3.5內(nèi)容 ?? ??? ?message.setText("你好,已經(jīng)發(fā)送成功! ?正文...."); // 簡單純文本郵件 ?? ??? ?message.saveChanges(); // 保存郵件(可選) ? ?? ??? ?// 4. 發(fā)送 ?? ??? ?Transport trans = session.getTransport(); ?? ??? ?trans.connect("xxx@163.com", "xxx"); ?? ??? ?// 發(fā)送郵件 ?? ??? ?trans.sendMessage(message, message.getAllRecipients()); ?? ??? ?trans.close(); ?? ?} }
MIME組合關(guān)系
- multipart/mixed類型
如果一封郵件中含有附件,那郵件的Content-Type域中必須定義multipart/mixed類型,郵件通過multipart/mixed類型中定義的boundary標(biāo)識將附件內(nèi)容同郵件其它內(nèi)容分成不同的段。
- multipart/related類型
MIME郵件中除了可以攜帶各種附件外,還可以將其它內(nèi)容以內(nèi)嵌資源的方式存儲在郵件中。比如我們在發(fā)送html格式的郵件內(nèi)容時,可能使用圖像作為html的背景,html文本會被存儲在alternative段中,而作為背景的圖像則會存儲在multipart/related類型定義的段中。
- multipart/alternative類型
MIME郵件可以傳送超文本內(nèi)容,但出于兼容性的考慮,一般在發(fā)送超文本格式內(nèi)容的同時會同時發(fā)送一個純文本內(nèi)容的副本,如果郵件中同時存在純文本和超文本內(nèi)容,則郵件需要在Content-Type域中定義multipart/alternative類型,郵件通過其boundary中的分段標(biāo)識將純文本、超文本和郵件的其它內(nèi)容分成不同的段。
郵件結(jié)構(gòu)
JAF框架
JAF(JavaBeans Activation Framework,JavaBeans激活框架)是一個專用的數(shù)據(jù)處理框架,它用于封裝數(shù)據(jù),并為應(yīng)用程序提供訪問和操作數(shù)據(jù)的接口。
JAF的主要作用在于讓Java應(yīng)用程序知道如何對一個數(shù)據(jù)源進(jìn)行查看、編輯和打印等操作。對于通過JAF封裝的數(shù)據(jù),應(yīng)用程序通過JAF提供的接口可以完成如下功能:
- 訪問數(shù)據(jù)源中的數(shù)據(jù)
- 獲知數(shù)據(jù)源的數(shù)據(jù)類型
- 獲知可對數(shù)據(jù)進(jìn)行的各種操作
- 用戶對數(shù)據(jù)執(zhí)行某種操作時,自動創(chuàng)建執(zhí)行該操作的軟件部件的實例對象
JavaMail API可以利用JAF從某種數(shù)據(jù)源中讀取數(shù)據(jù)和獲知數(shù)據(jù)的MIME類型,并用這些數(shù)據(jù)生成MIME消息中的消息體和消息類型。
發(fā)送帶文本、圖片的郵件
package com.haiwen.test; ? import java.io.File; import java.util.Date; import java.util.Properties; ? import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.Message.RecipientType; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; ? import org.junit.Test; ? public class MessageDemo2 { ? ?? ?// 初始化參數(shù) ?? ?private static Properties prop; ?? ?// 發(fā)件人 ?? ?private static InternetAddress sendMan = null; ?? ?static { ?? ??? ?prop = new Properties(); ?? ??? ?prop.put("mail.transport.protocol", "smtp"); // 協(xié)議 ?? ??? ?prop.put("mail.smtp.host", "smtp.163.com"); // 主機(jī) ?? ??? ?// prop.put("mail.smtp.port", 25); // 端口 ?? ??? ?prop.put("mail.smtp.auth", "true"); // 用戶密碼認(rèn)證 ?? ??? ?prop.put("mail.debug", "true"); // 調(diào)試模式 ?? ??? ?try { ?? ??? ??? ?sendMan = new InternetAddress("xxx@163.com"); ?? ??? ?} catch (AddressException e) { ?? ??? ??? ?throw new RuntimeException(e); ?? ??? ?} ?? ?} ? ?? ?@Test ?? ?public void testSend() throws Exception { ?? ??? ?// 1. 創(chuàng)建郵件會話 ?? ??? ?Session session = Session.getDefaultInstance(prop); ?? ??? ?// 2. 創(chuàng)建郵件對象 ?? ??? ?MimeMessage message = new MimeMessage(session); ?? ??? ?// 3. 設(shè)置參數(shù):標(biāo)題、發(fā)件人、收件人、發(fā)送時間、內(nèi)容 ?? ??? ?message.setSubject("帶圖片郵件"); ?? ??? ?message.setSender(sendMan); ?? ??? ?message.setRecipient(RecipientType.TO, new InternetAddress("xxx.com")); ?? ??? ?message.setSentDate(new Date()); ? ?? ??? ?/*************** 設(shè)置郵件內(nèi)容: 多功能用戶郵件 (related) *******************/ ?? ??? ?// 4.1 構(gòu)建一個多功能郵件塊 ?? ??? ?MimeMultipart related = new MimeMultipart("related"); ?? ??? ?// 4.2 構(gòu)建多功能郵件塊內(nèi)容 = 左側(cè)文本 + 右側(cè)圖片資源 ?? ??? ?MimeBodyPart content = new MimeBodyPart(); ?? ??? ?MimeBodyPart resource = new MimeBodyPart(); ? ?? ??? ?// 設(shè)置具體內(nèi)容: a.資源(圖片) ?? ??? ?String filePath = MessageDemo2.class.getResource("mm.png").getPath(); ?? ??? ?DataSource ds = new FileDataSource(new File(filePath)); ? ? ? ? ? ? ? ? //使用到了JAF框架把磁盤上的文件加到resource ?? ??? ?DataHandler handler = new DataHandler(ds); ?? ??? ?resource.setDataHandler(handler); ?? ??? ?resource.setContentID("mm.png"); // 設(shè)置資源名稱,給外鍵引用 ? ?? ??? ?// 設(shè)置具體內(nèi)容: b.文本 ?? ??? ?content.setContent("<img src='cid:mm.png'/> ?好哈哈!", "text/html;charset=UTF-8"); ? ?? ??? ?related.addBodyPart(content); ?? ??? ?related.addBodyPart(resource); ? ?? ??? ?/******* 4.3 把構(gòu)建的復(fù)雜郵件快,添加到郵件中 ********/ ?? ??? ?message.setContent(related); ? ?? ??? ?// 5. 發(fā)送 ?? ??? ?Transport trans = session.getTransport(); ?? ??? ?trans.connect("xxx@163.com", "xxx"); ?? ??? ?trans.sendMessage(message, message.getAllRecipients()); ?? ??? ?trans.close(); ?? ?} }
發(fā)送帶文本、圖片、附件的郵件
package com.haiwen.test; ? import java.io.File; import java.util.Date; import java.util.Properties; ? import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.Message.RecipientType; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; ? import org.junit.Test; ? public class MessageDemo3 { ? ?? ?// 初始化參數(shù) ?? ?private static Properties prop; ?? ?// 發(fā)件人 ?? ?private static InternetAddress sendMan = null; ?? ?static { ?? ??? ?prop = new Properties(); ?? ??? ?prop.put("mail.transport.protocol", "smtp"); // 指定協(xié)議 ?? ??? ?prop.put("mail.smtp.host", "smtp.163.com"); // 主機(jī) stmp.qq.com ?? ??? ?// prop.put("mail.smtp.port", 25); // 端口 ?? ??? ?prop.put("mail.smtp.auth", "true"); // 用戶密碼認(rèn)證 ?? ??? ?prop.put("mail.debug", "true"); // 調(diào)試模式 ?? ??? ?try { ?? ??? ??? ?sendMan = new InternetAddress("xxx@163.com"); ?? ??? ?} catch (AddressException e) { ?? ??? ??? ?throw new RuntimeException(e); ?? ??? ?} ?? ?} ? ?? ?@Test ?? ?public void testSend() throws Exception { ?? ??? ?// 1. 創(chuàng)建郵件會話 ?? ??? ?Session session = Session.getDefaultInstance(prop); ?? ??? ?// 2. 創(chuàng)建郵件對象 ?? ??? ?MimeMessage message = new MimeMessage(session); ?? ??? ?// 3. 設(shè)置參數(shù):標(biāo)題、發(fā)件人、收件人、發(fā)送時間、內(nèi)容 ?? ??? ?message.setSubject("帶圖片郵件"); ?? ??? ?message.setSender(sendMan); ?? ??? ?message.setRecipient(RecipientType.TO, new InternetAddress("xxx.com")); ?? ??? ?message.setSentDate(new Date()); ? ?? ??? ?/* ?? ??? ? * 帶附件(圖片)郵件開發(fā) ?? ??? ? */ ?? ??? ?// 構(gòu)建一個總的郵件塊 ?? ??? ?MimeMultipart mixed = new MimeMultipart("mixed"); ?? ??? ?// ---> 總郵件快,設(shè)置到郵件對象中 ?? ??? ?message.setContent(mixed); ?? ??? ?// 左側(cè): (文本+圖片資源) ?? ??? ?MimeBodyPart left = new MimeBodyPart(); ?? ??? ?// 右側(cè): 附件 ?? ??? ?MimeBodyPart right = new MimeBodyPart(); ?? ??? ?// 設(shè)置到總郵件塊 ?? ??? ?mixed.addBodyPart(left); ?? ??? ?mixed.addBodyPart(right); ? ?? ??? ?/****** 附件 ********/ ?? ??? ?String attr_path = this.getClass().getResource("a.docx").getPath(); ?? ??? ?DataSource attr_ds = new FileDataSource(new File(attr_path)); ?? ??? ?DataHandler attr_handler = new DataHandler(attr_ds); ?? ??? ?right.setDataHandler(attr_handler); ?? ??? ?right.setFileName("a.docx"); ? ?? ??? ?/*************** 設(shè)置郵件內(nèi)容: 多功能用戶郵件 (related) *******************/ ?? ??? ?// 4.1 構(gòu)建一個多功能郵件塊 ?? ??? ?MimeMultipart related = new MimeMultipart("related"); ?? ??? ?// ----> 設(shè)置到總郵件快的左側(cè)中 ?? ??? ?left.setContent(related); ? ?? ??? ?// 4.2 構(gòu)建多功能郵件塊內(nèi)容 = 左側(cè)文本 + 右側(cè)圖片資源 ?? ??? ?MimeBodyPart content = new MimeBodyPart(); ?? ??? ?MimeBodyPart resource = new MimeBodyPart(); ? ?? ??? ?// 設(shè)置具體內(nèi)容: a.資源(圖片) ?? ??? ?String filePath = MessageDemo3.class.getResource("mm.png").getPath(); ?? ??? ?DataSource ds = new FileDataSource(new File(filePath)); ?? ??? ?DataHandler handler = new DataHandler(ds); ?? ??? ?resource.setDataHandler(handler); ?? ??? ?resource.setContentID("mm.png"); // 設(shè)置資源名稱,給外鍵引用 ? ?? ??? ?// 設(shè)置具體內(nèi)容: b.文本 ?? ??? ?content.setContent("<img src='cid:mm.png'/> ?好哈哈!", "text/html;charset=UTF-8"); ? ?? ??? ?related.addBodyPart(content); ?? ??? ?related.addBodyPart(resource); ? ?? ??? ?// 5. 發(fā)送 ?? ??? ?Transport trans = session.getTransport(); ?? ??? ?trans.connect("xxx@163.com", "xxx"); ?? ??? ?trans.sendMessage(message, message.getAllRecipients()); ?? ??? ?trans.close(); ?? ?} }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java連接 JDBC基礎(chǔ)知識(操作數(shù)據(jù)庫:增刪改查)
這篇文章主要介紹了Java連接 JDBC基礎(chǔ)知識,包括操作數(shù)據(jù)庫之增刪改查操作,需要的朋友可以參考下2021-04-04- 本章具體介紹了HashMap、TreeMap兩種集合的基本使用方法和區(qū)別,圖解穿插代碼實現(xiàn)。?JAVA成仙路從基礎(chǔ)開始講,后續(xù)會講到JAVA高級,中間會穿插面試題和項目實戰(zhàn),希望能給大家?guī)韼椭?/div> 2022-03-03
深入學(xué)習(xí)spring cloud gateway 限流熔斷
這篇文章主要介紹了深入學(xué)習(xí)spring cloud gateway 限流熔斷,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Springboot基于assembly的服務(wù)化打包方案及spring boot部署方式
這篇文章主要介紹了Springboot基于assembly的服務(wù)化打包方案及springboot項目的幾種常見的部署方式,本文主要針對第二種部署方式提供一種更加友好的打包方案,需要的朋友可以參考下2017-12-12關(guān)于@JsonProperty,@NotNull,@JsonIgnore的具體使用
這篇文章主要介紹了關(guān)于@JsonProperty,@NotNull,@JsonIgnore的具體使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08最新評論