1. 程式人生 > 實用技巧 >狂神說Java【網站註冊傳送郵件功能實現】—— (三) 複雜郵件傳送實現

狂神說Java【網站註冊傳送郵件功能實現】—— (三) 複雜郵件傳送實現

複雜郵件就是非純文字的郵件,可能還包含了圖片和附件等資源

先認識兩個類一個名詞:

MIME(多用途網際網路郵件擴充套件型別)

  • MimeBodyPart類

​ javax.mail.internet.MimeBodyPart類表示的是一個MIME訊息,它和MimeMessage類一樣都是從Part介面繼承過來。即一個MIME訊息對應一個MimeBodyPart物件,而MimeBodyPart物件就是我們寫的郵件內容中的元素

  • MimeMultipart類

​ javax.mail.internet.MimeMultipart是抽象類 Multipart的實現子類,它用來組合多個MIME訊息

。一個MimeMultipart物件可以包含多個代表MIME訊息的MimeBodyPart物件。即一個MimeMultipart物件表示多個MimeBodyPart的集合,而一個MimeMultipart表示的就是我們一封郵件的內容

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("===============================================================");


功能測試通過!