JavaMail入門教程之創(chuàng)建郵件(2)
JavaMail API使用javax.mail.Message類來表示一封郵件,Message類是一個(gè)抽象類,所以我們需要使用其子類javax.mail.internet.MimeMessage類來創(chuàng)建Message類的實(shí)例對(duì)象,如果我們創(chuàng)建的是一個(gè)簡(jiǎn)單文本郵件,那么MimeMessage類就可以滿足我們的需求了,但是如果需要?jiǎng)?chuàng)建一封包含內(nèi)嵌資源或者是帶附件的復(fù)雜郵件,則需要使用到JavaMail API中的MimeMessage、javax.mail.internet.MimeBodyPart和javax.mail.internet.MimeMultipart等類。
1、MimeMessage類表示整封郵件
2、MimeBodyPart類表示郵件的一個(gè)MIME消息
3、MimeMultipart類表示一個(gè)由多個(gè)MIME消息組合成的組合MIME消息。
這三個(gè)類的工作關(guān)系如下圖所示:

雖然應(yīng)用程序開發(fā)者在使用JavaMailAPI創(chuàng)建郵件內(nèi)容時(shí),通常只需要使用MimeMessage,MimeBodyPart和MimeMultipart這3個(gè)主要的類,但是了解他們的類繼承關(guān)系也是必要的。下圖列出了這三個(gè)類的繼承關(guān)系以及常用方法。

下面用javax.mail.internet.MimeMessage類來創(chuàng)建一封簡(jiǎn)單的文本郵件,
import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.FileOutputStream;
public class TextMessage {
public static void main(String[] args) throws Exception {
String from = "123456@qq.com";
String to = "123456@163.com";
String subject = "test";
String body = "test!!!";
// 創(chuàng)建Session實(shí)例對(duì)象
Session session = Session.getDefaultInstance(new Properties());
// 創(chuàng)建MimeMessage實(shí)例對(duì)象
MimeMessage msg = new MimeMessage(session);
// 設(shè)置發(fā)件人
msg.setFrom(new InternetAddress(from));
// 設(shè)置收件人
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
// 設(shè)置發(fā)送日期
msg.setSentDate(new Date());
// 設(shè)置郵件主題
msg.setSubject(subject);
// 設(shè)置純文本內(nèi)容的郵件正文
msg.setText(body);
// 保存并生成最終的郵件內(nèi)容
msg.saveChanges();
// 把MimeMessage對(duì)象中的內(nèi)容寫入到文件中
msg.writeTo(new FileOutputStream("c:\\test.eml"));
}
}
我們用郵件客戶端(這里用foxmail)打開C盤下面的test.eml文件,可以看到如下信息,說明我們的郵件創(chuàng)建成功。

下面簡(jiǎn)單解釋一下上面出現(xiàn)的一些類
1、MimeMessage類:上面介紹過MimeMessage是Message類的一個(gè)具體實(shí)現(xiàn)類,用來創(chuàng)建Message類的實(shí)例對(duì)象,這里構(gòu)造函數(shù)傳入了一個(gè)Session對(duì)象作為參數(shù);
2、Session類:該對(duì)象用于收集客戶端與郵件服務(wù)器之間的網(wǎng)絡(luò)連接信息和定義整個(gè)郵件程序所需的環(huán)境信息,這些信息作為Session對(duì)象的屬性保存在Session對(duì)象中,Session對(duì)象利用了java.util.Properties對(duì)象獲得了郵件服務(wù)器、用戶名、密碼信息和整個(gè)應(yīng)用程序都要使用到的共享信息,由于Session類的構(gòu)造方法是私有的,所以我們使用Session類提供的getDefaultInstance()這個(gè)靜態(tài)工廠方法獲得一個(gè)默認(rèn)的Session對(duì)象;
3、Properties類:該類表示了一個(gè)持久的屬性集,用于存放相關(guān)鍵值對(duì)信息作為參數(shù)來創(chuàng)建Session對(duì)象,這里構(gòu)造了一個(gè)空的集合作為參數(shù);
4、InternetAddress類:該類是抽象類Address類的一個(gè)子類,用來創(chuàng)建一個(gè)郵件地址;
5、RecipientType類:該類是Message類的一個(gè)內(nèi)部類,該類有3個(gè)靜態(tài)變量,TO表示收件人,CC表示抄送人(收件人知道抄送的人),BCC表示密送人(收件人不知道密送的人)。
上面的郵件只是包含了簡(jiǎn)單的文本,有時(shí)候我們需要使用HTML文件來豐富我們的郵件正文,例如使用HTML標(biāo)簽來對(duì)郵件正文進(jìn)行排版,使用HTML標(biāo)簽在郵件正文中引入一些圖片或者是聲音等。下面這段代碼創(chuàng)建了一個(gè)包含HTML格式的郵件
import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.FileOutputStream;
public class HtmlMessage {
public static void main(String[] args) throws Exception {
String from = "123456@qq.com";
String to = "123456@163.com";
String subject = "test";
String body = "<h4>歡迎大家閱讀此郵件</h4>";
// 創(chuàng)建Session實(shí)例對(duì)象
Session session = Session.getDefaultInstance(new Properties());
// 創(chuàng)建MimeMessage實(shí)例對(duì)象
MimeMessage msg = new MimeMessage(session);
// 設(shè)置發(fā)件人
msg.setFrom(new InternetAddress(from));
// 設(shè)置收件人
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
// 設(shè)置發(fā)送日期
msg.setSentDate(new Date());
// 設(shè)置郵件主題
msg.setSubject(subject);
// 設(shè)置HTML格式的郵件正文
msg.setContent(body, "text/html;charset=gb2312");
// 保存并生成最終的郵件內(nèi)容
msg.saveChanges();
// 把MimeMessage對(duì)象中的內(nèi)容寫入到文件中
msg.writeTo(new FileOutputStream("c:\\test.eml"));
}
}
我們?cè)儆胒oxmail打開test.eml,顯示如下

與之前代碼不同的地方只是我們?cè)O(shè)置郵件內(nèi)容的時(shí)候用setContent方法代替了setText方法,并且指定了郵件正文的MIME類型為text/html。
現(xiàn)在我們學(xué)會(huì)了創(chuàng)建含有HTML標(biāo)簽的郵件了,不過有時(shí)我們可能需要在郵件中插入一些圖片來更直觀的表達(dá)我們的意思,那么這時(shí)候我們就需要用到MimeMultipart類與MimeBodyPart類了
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;
public class PictureMessage {
public static void main(String[] args) throws Exception {
String from = "123456@qq.com";// 發(fā)件人地址
String to = "123456@163.com"; // 收件人地址
String subject = "HTML郵件";
String body = "<a href=http://www.cnblogs.com>" + "歡迎大家訪問博客園</a></br>"
+ "<img src=\"c:\\dog.jpg\">";
Session session = Session.getDefaultInstance(new Properties());
// 創(chuàng)建MimeMessage對(duì)象,并設(shè)置各種郵件頭字段
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
message.setSubject(subject);
// 創(chuàng)建一個(gè)子類型為"related"的MimeMultipart對(duì)象。
MimeMultipart multipart = new MimeMultipart("related");
/*
* 創(chuàng)建一個(gè)表示HTML正文的MimeBodyPart對(duì)象, 并將它加入到前面創(chuàng)建的MimeMultipart對(duì)象中
*/
MimeBodyPart htmlBodyPart = new MimeBodyPart();
htmlBodyPart.setContent(body, "text/html;charset=gb2312");
multipart.addBodyPart(htmlBodyPart);
/*
* 創(chuàng)建一個(gè)表示圖片內(nèi)容的MimeBodyPart對(duì)象, 并將它加入到前面創(chuàng)建的MimeMultipart對(duì)象中
*/
MimeBodyPart gifBodyPart = new MimeBodyPart();
FileDataSource fds = new FileDataSource("c:\\dog.jpg");
gifBodyPart.setFileName(fds.getName());
gifBodyPart.setDataHandler(new DataHandler(fds));
multipart.addBodyPart(gifBodyPart);
/*
* 將MimeMultipart對(duì)象設(shè)置為整個(gè)郵件的內(nèi)容, 要注意調(diào)用saveChanges方法進(jìn)行更新
*/
message.setContent(multipart);
message.saveChanges();
// 把MimeMessage對(duì)象中的內(nèi)容寫入到文件中
message.writeTo(new FileOutputStream("c:\\PictureMessage.eml"));
}
}
代碼看起來似乎有點(diǎn)小復(fù)雜,可以再看看上面提到的MimeMessage,MimeMultipart與MimeBodyPart這三個(gè)類之間的關(guān)系圖,這樣會(huì)更會(huì)容易理解上面的代碼,我們打開PictureMessage.eml,看到如下信息,說明我們成功的創(chuàng)建了一個(gè)帶有圖片的郵件了,并且該圖片以附件的形式包含在郵件中了

MimeMultipart有兩種構(gòu)造函數(shù),
public MimeMultipart() public MimeMultipart(String subtype)
第一種是無參數(shù)的,其默認(rèn)的實(shí)例對(duì)象的MIME類型為mixed,第二種制定一個(gè)類型來創(chuàng)建MimeMultipart類的實(shí)例對(duì)象,其有三種常用的類型:mixed,related,alternative,這三種類型在MIME中的組合關(guān)系如下所示:

現(xiàn)在我們用上面所示的這種組合關(guān)系來創(chuàng)建一封帶有附件,并且正文中帶有內(nèi)嵌資源的郵件
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;
public class ComplexMessage {
public static void main(String[] args) throws Exception {
Session session = Session.getDefaultInstance(new Properties());
MimeMessage message = createMessage(session);
message.writeTo(new FileOutputStream("c:\\ComplexMessage.eml"));
}
public static MimeMessage createMessage(Session session) throws Exception {
String from = "123456@qq.com";// 發(fā)件人地址
String to = "123456@163.com"; // 收件人地址
String subject = "HTML郵件"; // 郵件主題
String body = "<a href=http://www.cnblogs.com>" + "歡迎大家訪問博客園</a></br>"
+ "<img src=\"c:\\dog.jpg\">";
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
message.setSubject(subject);
// 創(chuàng)建代表郵件正文和附件的各個(gè)MimeBodyPart對(duì)象
MimeBodyPart contentPart = createContent(body, "c:\\dog.jpg");
// 下面的附件可以是視頻或者是音頻
MimeBodyPart attachPart1 = createAttachment("c:\\音樂.MP3");
MimeBodyPart attachPart2 = createAttachment("c:\\視頻.avi");
// 創(chuàng)建用于組合郵件正文和附件的MimeMultipart對(duì)象
MimeMultipart allMultipart = new MimeMultipart("mixed");
allMultipart.addBodyPart(contentPart);
allMultipart.addBodyPart(attachPart1);
allMultipart.addBodyPart(attachPart2);
// 設(shè)置整個(gè)郵件內(nèi)容為最終組合出的MimeMultipart對(duì)象
message.setContent(allMultipart);
message.saveChanges();
return message;
}
public static MimeBodyPart createContent(String body, String filename)
throws Exception {
/*
* 創(chuàng)建代表組合MIME消息的MimeMultipart對(duì)象, 和將該MimeMultipart對(duì)象保存到的MimeBodyPart對(duì)象
*/
MimeBodyPart contentPart = new MimeBodyPart();
MimeMultipart contentMultipart = new MimeMultipart("related");
/*
* 創(chuàng)建用于保存HTML正文的MimeBodyPart對(duì)象, 并將它保存到MimeMultipart中
*/
MimeBodyPart htmlBodyPart = new MimeBodyPart();
htmlBodyPart.setContent(body, "text/html;charset=gb2312");
contentMultipart.addBodyPart(htmlBodyPart);
/*
* 創(chuàng)建用于保存圖片的MimeBodyPart對(duì)象, 并將它保存到MimeMultipart中
*/
MimeBodyPart gifBodyPart = new MimeBodyPart();
FileDataSource fds = new FileDataSource(filename);
gifBodyPart.setDataHandler(new DataHandler(fds));
contentMultipart.addBodyPart(gifBodyPart);
// 將MimeMultipart對(duì)象保存到MimeBodyPart對(duì)象中
contentPart.setContent(contentMultipart);
return contentPart;
}
public static MimeBodyPart createAttachment(String filename)
throws Exception {
// 創(chuàng)建保存附件的MimeBodyPart對(duì)象,并加入附件內(nèi)容和相應(yīng)信息
MimeBodyPart attachPart = new MimeBodyPart();
FileDataSource fds = new FileDataSource(filename);
attachPart.setDataHandler(new DataHandler(fds));
attachPart.setFileName(fds.getName());
return attachPart;
}
}
打開ComplexMessage.eml文件,可以看到如下內(nèi)容:

現(xiàn)在我們學(xué)會(huì)了如何創(chuàng)建一封純文本的郵件,帶有HTML格式的郵件,以及帶有內(nèi)嵌圖片與附件的郵件了,下一篇將介紹如何發(fā)送郵件JavaMail入門第三篇 發(fā)送郵件
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JavaWeb中JavaMail創(chuàng)建郵件和發(fā)送郵件
- 創(chuàng)建基于ASP.NET的SMTP郵件服務(wù)的具體方法
- java mail使用qq郵箱發(fā)郵件的配置方法
- Java郵件發(fā)送程序(可以同時(shí)發(fā)給多個(gè)地址、可以帶附件)
- java中javamail發(fā)送帶附件的郵件實(shí)現(xiàn)方法
- Java基于JavaMail實(shí)現(xiàn)向QQ郵箱發(fā)送郵件
- java 發(fā)送郵件的實(shí)例代碼(可移植)
- java實(shí)現(xiàn)基于SMTP發(fā)送郵件的方法
- Java Mail與Apache Mail發(fā)送郵件示例
- java發(fā)送郵件的具體實(shí)現(xiàn)
相關(guān)文章
java使用mybatis調(diào)用存儲(chǔ)過程返回一個(gè)游標(biāo)結(jié)果集方式
這篇文章主要介紹了java使用mybatis調(diào)用存儲(chǔ)過程返回一個(gè)游標(biāo)結(jié)果集方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
淺談SpringCache與redis集成實(shí)現(xiàn)緩存解決方案
本篇文章主要介紹了淺談SpringCache與redis集成實(shí)現(xiàn)緩存解決方案,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
如何基于Java實(shí)現(xiàn)對(duì)象List排序
這篇文章主要介紹了如何基于Java實(shí)現(xiàn)對(duì)象List排序,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
MyBatis查詢時(shí)屬性名和字段名不一致問題的解決方法
這篇文章主要給大家介紹了關(guān)于MyBatis查詢時(shí)屬性名和字段名不一致問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Java并行執(zhí)行任務(wù)的幾種方案小結(jié)
這篇文章主要介紹了Java并行執(zhí)行任務(wù)的幾種方案小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Java CAS底層實(shí)現(xiàn)原理實(shí)例詳解
這篇文章主要介紹了Java CAS底層實(shí)現(xiàn)原理實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
解決Eclipse的Servers視圖中無法添加Tomcat6/Tomcat7的方法
這篇文章主要介紹了解決Eclipse的Servers視圖中無法添加Tomcat6/Tomcat7的方法的相關(guān)資料,需要的朋友可以參考下2017-02-02
java實(shí)現(xiàn)一個(gè)簡(jiǎn)單TCPSocket聊天室功能分享
這篇文章主要為大家分享了java實(shí)現(xiàn)的一個(gè)簡(jiǎn)單TCPSocket聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-04-04
Java之String字符串在JVM中的存儲(chǔ)及其內(nèi)存地址的問題
這篇文章主要介紹了Java之String字符串在JVM中的存儲(chǔ)及其內(nèi)存地址的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07

