狂神說Java【網站註冊傳送郵件功能實現】—— (三) 複雜郵件傳送實現
阿新 • • 發佈:2020-09-09
複雜郵件就是非純文字的郵件,可能還包含了圖片和附件等資源
先認識兩個類一個名詞:
MIME(多用途網際網路郵件擴充套件型別)
- MimeBodyPart類
javax.mail.internet.MimeBodyPart類表示的是一個MIME訊息,它和MimeMessage類一樣都是從Part介面繼承過來。即一個MIME訊息對應一個MimeBodyPart物件,而MimeBodyPart物件就是我們寫的郵件內容中的元素
- MimeMultipart類
javax.mail.internet.MimeMultipart是抽象類 Multipart的實現子類,它用來組合多個MIME訊息
MimeMultipart物件的使用的時候需要設定setSubType()的屬性值,一共就下面3種取值
- alternative:表明這個MimeMultipart物件中的MimeMessage物件的資料是純文字檔案
- related:表明這個MimeMultipart物件中的MimeMessage物件的資料包含非純文字檔案
- mixed:表明這個MimeMultipart物件中的MimeMessage物件的資料包含附件
我們在使得的時候如果不知道使用哪一個,直接使用mixed即可,使用這個屬性值一定不會報錯
相較於簡單郵件,複雜郵件變化的地方只是在於郵件內容本身會發送變化,而其他的步驟都是一樣的
1、準備一些引數
2、獲取session物件
3、獲取傳輸物件
4、登陸授權
5、寫郵件 (和簡單郵件相區別)
6、傳送郵件
7、關閉伺服器資源
1、傳送包含圖片的複雜郵件
package com.thhh; import com.sun.mail.util.MailSSLSocketFactory; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import java.util.Properties; //傳送一封簡單的郵件 public class MailDemo01 { public static void main(String[] args) throws Exception { Properties prop = new Properties(); prop.setProperty("mail.host", "smtp.qq.com"); //設定QQ郵件伺服器 prop.setProperty("mail.transport.protocol", "smtp"); // 郵件傳送協議 prop.setProperty("mail.smtp.auth", "true"); // 需要驗證使用者名稱密碼 // 關於QQ郵箱,還要設定SSL加密,加上以下程式碼即可 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); prop.put("mail.smtp.ssl.enable", "true"); prop.put("mail.smtp.ssl.socketFactory", sf); //使用JavaMail傳送郵件的5個步驟 //1、建立定義整個應用程式所需的環境資訊的 Session 物件 //使用QQ郵箱的時候才需要,其他郵箱不需要這一段程式碼 Session session = Session.getDefaultInstance(prop, new Authenticator() {//獲取和SMTP伺服器的連線物件 public PasswordAuthentication getPasswordAuthentication() { //發件人郵件使用者名稱、授權碼 return new PasswordAuthentication("[email protected]", "授權碼"); } }); //開啟Session的debug模式,這樣就可以檢視到程式傳送Email的執行狀態 session.setDebug(true); //2、通過session得到transport物件 Transport ts = session.getTransport();//通過這一次和SMTP伺服器的連線物件獲取傳送郵件的傳輸物件 //3、使用郵箱的使用者名稱和授權碼連上SMTP郵件伺服器,即登陸 ts.connect("smtp.qq.com", "[email protected]", "授權碼"); //4、建立郵件物件MimeMessage——點選網頁上的寫信 //建立一個郵件物件 MimeMessage message = new MimeMessage(session); //指明郵件的發件人——在網頁上填寫發件人 message.setFrom(new InternetAddress("[email protected]"));//設定發件人 //指明郵件的收件人,現在發件人和收件人是一樣的,那就是自己給自己發——在網頁上填寫收件人 message.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]"));//設定收件人 //郵件的標題——在網頁上填寫郵件標題 message.setSubject("簡單郵件傳送實現");//設定郵件主題 System.out.println("=============================複雜郵件的郵件內容設定=================================="); // 準備郵件資料 // 準備圖片資料 MimeBodyPart image = new MimeBodyPart();//獲取一個圖片的MimeBodyPart物件 DataHandler dh = new DataHandler(new FileDataSource("圖片的絕對地址"));//由於圖片需要字元化才能傳輸,所以需要獲取一個DataHandler物件 image.setDataHandler(dh);//將圖片序列化 image.setContentID("bz.jpg");//為圖片的MimeBodyPart物件設定一個ID,我們在文字中就可以使用它了 // 準備正文資料 MimeBodyPart text = new MimeBodyPart();//獲取一個文字的MimeBodyPart物件 text.setContent("這是一封郵件正文帶圖片<img src='cid:bz.jpg'>的郵件", "text/html;charset=UTF-8");//設定文字內容,注意在裡面嵌入了<img src='cid:bz.jpg'> // 描述資料關係 MimeMultipart mm = new MimeMultipart();//獲取MimeMultipart mm.addBodyPart(text);//將文字MimeBodyPart物件加入MimeMultipart中 mm.addBodyPart(image);//將圖片MimeBodyPart物件加入MimeMultipart中 mm.setSubType("related");//設定MimeMultipart物件的相對熟悉為related,即傳送的資料為文字+非附件資源 //設定到訊息中,儲存修改 message.setContent(mm);//將MimeMultipart放入訊息物件中 message.saveChanges();//儲存上面的修改 System.out.println("==============================================================="); //5、傳送郵件——在網頁上點擊發送按鈕 ts.sendMessage(message, message.getAllRecipients()); //6、關閉連線物件,即關閉伺服器上的連線資源 ts.close(); } }
只改了第5步
// 準備郵件資料
// 準備圖片資料
MimeBodyPart image = new MimeBodyPart();//獲取一個圖片的MimeBodyPart物件
DataHandler dh = new DataHandler(new FileDataSource("圖片的絕對地址"));//由於圖片需要字元化才能傳輸,所以需要獲取一個DataHandler物件
image.setDataHandler(dh);//將圖片序列化
image.setContentID("bz.jpg");//為圖片的MimeBodyPart物件設定一個ID,我們在文字中就可以使用它了
// 準備正文資料
MimeBodyPart text = new MimeBodyPart();//獲取一個文字的MimeBodyPart物件
text.setContent("這是一封郵件正文帶圖片<img src='cid:bz.jpg'>的郵件", "text/html;charset=UTF-8");//設定文字內容,注意在裡面嵌入了<img src='cid:bz.jpg'>
// 描述資料關係
MimeMultipart mm = new MimeMultipart();//獲取MimeMultipart
mm.addBodyPart(text);//將文字MimeBodyPart物件加入MimeMultipart中
mm.addBodyPart(image);//將圖片MimeBodyPart物件加入MimeMultipart中
mm.setSubType("related");//設定MimeMultipart物件的相對熟悉為related,即傳送的資料為文字+非附件資源
//設定到訊息中,儲存修改
message.setContent(mm);//將MimeMultipart放入訊息物件中
message.saveChanges();//儲存上面的修改
2、傳送包含附件的複雜郵件
System.out.println("=============================複雜郵件的郵件內容設定==================================");
/*
編寫郵件內容
1.圖片
2.附件
3.文字
*/
//圖片
MimeBodyPart body1 = new MimeBodyPart();
body1.setDataHandler(new DataHandler(new FileDataSource("圖片的絕對地址")));
body1.setContentID("yhbxb.png"); //圖片設定ID
//文字
MimeBodyPart body2 = new MimeBodyPart();
body2.setContent("請注意,我不是廣告<img src='cid:yhbxb.png'>","text/html;charset=utf-8");
//附件
MimeBodyPart body3 = new MimeBodyPart();
body3.setDataHandler(new DataHandler(new FileDataSource("附件1的絕對地址")));
body3.setFileName("test.c"); //附件設定名字
MimeBodyPart body4 = new MimeBodyPart();
body4.setDataHandler(new DataHandler(new FileDataSource("附件2的絕對地址")));
body4.setFileName("test.txt"); //附件設定名字
//拼裝郵件正文內容
MimeMultipart multipart1 = new MimeMultipart();
multipart1.addBodyPart(body1);
multipart1.addBodyPart(body2);
multipart1.setSubType("related"); //1.文字和圖片內嵌成功!
//new MimeBodyPart().setContent(multipart1); //將拼裝好的正文內容設定為主體
MimeBodyPart contentText = new MimeBodyPart();
contentText.setContent(multipart1);
//拼接附件
MimeMultipart allFile =new MimeMultipart();
allFile.addBodyPart(body3); //附件
allFile.addBodyPart(body4); //附件
allFile.addBodyPart(contentText);//正文
allFile.setSubType("mixed"); //正文和附件都存在郵件中,所有型別設定為mixed;
//設定到訊息中,儲存修改
message.setContent(allFile);//將MimeMultipart放入訊息物件中
message.saveChanges();//儲存上面的修改
System.out.println("===============================================================");
功能測試通過!