樂字節-Spring 郵件發送

Spring 郵件發送

主要內容

JavaMail 概述

​ JavaMail,顧名思義,提供給開發者處理電子郵件相關的編程接口。JavaMail 是由 Sun 定義的一套收發電子郵件的 API,它能夠方便地執行一些經常使用的郵件傳輸,不一樣的廠商能夠提供本身的實現類。但它並無包含在 JDK 中,而是做爲 JavaEE 的一部分。html

​ 廠商所提供的 JavaMail 服務程序能夠有選擇地實現某些郵件協議,常見的郵件協議包括:java

  • SMTP:簡單郵件傳輸協議,用於發送電子郵件的傳輸協議;
  • POP3:用於接收電子郵件的標準協議;
  • IMAP:互聯網消息協議,是 POP3 的替代協議。

​ 這三種協議都有對應 SSL 加密傳輸的協議,分別是 SMTPS,POP3S 和 IMAPS。除 JavaMail 服務提供程序以外, JavaMail 還須要 JAF(JavaBeans Activation Framework)來處理不是純文本的郵件內容,這包括 MIME(多用途互聯網郵件擴展)、URL 頁面和文件附件等內容。另外,JavaMail 依賴 JAF(JavaBeans Activation Framework),JAF 在 Java6 以後已經合併到 JDK 中,而 JDK5 以前須要另外下載 JAF 的類庫。spring

協議介紹

​ 在研究 JavaMail API 的細則以前,首先須要對於 API 用到的協議有個認識。對於 java mail 來講用到的協議有常見的幾種: SMTP、POP、IMAP、MIME編程

SMTP

​ 簡單郵件傳輸協議(Simple Mail Transfer Protocol,SMTP)由 RFC 821 定義。它定義了發送電子郵件的機制。在 JavaMail API 環境中,您基於 JavaMail 的程序將和您的公司或因特網服務供應商的(Internet Service
Provider’s,ISP’s)SMTP 服務器通訊。SMTP 服務器會中轉消息給接收方 SMTP 服務器以便最終讓用戶經由 POP 或 IMAP 得到。api

POP

​ POP 表明郵局協議(Post Office Protocol)。目前用的是版本 3,也稱 POP3,RFC 1939 定義了這個協議。POP 是一種機制,因特網上大多數人用它獲得郵件。它規定每一個用戶一個郵箱的支持。這就是它所能作的,而這也形成了許多混淆。使用 POP3 時,用戶熟悉的許多性能並非由 POP 協議支持的,如查看有幾封新郵件消息這一性能。這些性能內建於如 Eudora 或 Microsoft Outlook 之類的程序中,它們能記住一些事,諸如最近一次收到的郵件,還能計算出有多少是新的。因此當使用 JavaMail API 時,若是您想要這類信息,您就必須本身算。數組

IMAP

​ IMAP 是更高級的用於接收消息的協議。在 RFC 2060 中被定義,IMAP 表明因特網消息訪問協議(Internet Message Access Protocol),目前用的是版本 4,也稱 IMAP4。在用到 IMAP 時,郵件服務器必需支持這個協議。不能僅僅把使用 POP 的程序用於 IMAP,並期望它支持 IMAP 全部性能。假設郵件服務器支持 IMAP,基於 JavaMail 的程序能夠利用這種狀況 — 用戶在服務器上有多個文件夾(folder),而且這些文件夾能夠被多個用戶共享。由於有這一更高級的性能,您也許會認爲全部用戶都會使用 IMAP。事實並非這樣。要求服務器接收新消息,在用戶請求時發送到用戶手中,還要在每一個用戶的多個文件夾中維護消息。這樣雖然能將消息集中備份,但隨着用戶長期的郵件夾愈來愈大,到磁盤空間耗盡時,每一個用戶都會受到損失。使用 POP,就能卸載郵件服務器上保存的消息了。安全

MIME

​ MIME 表明多用途因特網郵件擴展標準(Multipurpose Internet Mail Extensions)。它不是郵件傳輸協議。但對傳輸內容的消息、附件及其它的內容定義了格式。這裏有不少不一樣的有效文檔:RFC 82二、RFC 204五、RFC
2046 和 RFC 2047。做爲一個 JavaMail API 的用戶,您一般沒必要對這些格式操心。不管如何,必定存在這些格式並且程序會用到它。服務器

JavaMail 的關鍵對象

​ JavaMail 對收發郵件進行了高級的抽象,造成了一些關鍵的的接口和類,它們構成了程序的基礎,下面咱們分別來了解一下這些最多見的對象。session

Properties 屬性對象

​ 因爲 JavaMail 須要和郵件服務器進行通訊,這就要求程序提供許多諸如服務器地址、端口、用戶名、密碼等信息,JavaMail 經過 Properties 對象封裝這些屬性信息。以下面的代碼封裝了兩個屬性信息:app

Properties props = new Properties();
props.put("mail.smtp.host", "smtp.sina.com.cn");
props.put("mail.smtp.auth", "true");

​ 針對不一樣的的郵件協議,JavaMail 規定了服務提供者必須支持一系列屬性,下表是針對 SMTP 協議的一些常見屬性(屬性值都以 String 類型進行設置,屬性類型欄僅表示屬性是如何被解析的):

屬性名

類型

說明

mail.smtp.host

String

SMTP 服務器地址,如smtp.sina.com.cn

mail.smtp.port

int

SMTP 服務器端口號,默認爲 25

mail.smtp.auth

boolean

SMTP 服務器是否須要用戶認證,默認爲 false

mail.smtp.user

String

SMTP 默認的登錄用戶名

mail.smtp.from

String

默認的郵件發送源地址

mail.smtp.socketFactory.class

String

socket 工廠類類名
經過設置該屬性能夠覆蓋提供者默認的實現,必須實現javax.NET.SocketFactory接口

mail.smtp.socketFactory.port

int

指定 socket 工廠類所用的端口號
若是沒有規定,則使用默認的端口號

mail.smtp.socketFactory.fallback

boolean

設置爲 true 時,當使用指定的socket 類建立 socket 失敗後,將使用 Java.net.Socket 建立socket,默認爲 true

mail.smtp.timeout

int

I/O 鏈接超時時間,單位爲毫秒,默認爲永不超時

​ 其餘幾個協議也有相似的一系列屬性,如 POP3 的 mail.pop3.host、mail.pop3.port 以及IMAP 的 mail.imap.host、mail.imap.host 等。

Session 會話對象

​ Session 是一個很容易被誤解的類,這歸咎於混淆視聽的類名。千萬不要覺得這裏的 Session 像 HttpSession 同樣表明真實的交互會話,但建立 Session 對象時,並無對應的物理鏈接,它只不過是一對配置信息的集合。

​ Session 的主要做用,包括兩個方面:

  1. 接收各類配置屬性信息:經過 Properties 對象設置的屬性信息;
  2. 初始化 JavaMail 環境:根據 JavaMail 的配置文件,初始化 JavaMail 環境,以便經過 Session 對象建立其餘重要類的實例。

Transport 和 Store 傳輸和存儲

​ 郵件操做只有發送或接收兩種處理方式,JavaMail 將這兩種不一樣操做描述爲傳輸(javax.mail.Transport)和存儲(javax.mail.Store),傳輸對應郵件的發送,而存儲對應郵件的接收。

Message 消息對象

​ 一旦得到 Session 對象,就能夠繼續建立要發送的消息。這由 Message 類來完成。由於 Message 是個抽象類,您必需用一個子類,多數狀況下爲 javax.mail.internet.MimeMessage。MimeMessage 是個能理解 MIME 類型和頭的電子郵件消息,正如不一樣 RFC 中所定義的。雖然在某些頭部域非 ASCII 字符也能被譯碼,但 Message 頭只能被限制爲用 US-ASCII 字符。

Address 地址

​ 一旦您建立了 Session 和 Message,並將內容填入消息後,就能夠用 Address 肯定信件地址了。和 Message 同樣,Address 也是個抽象類。您用的是 javax.mail.internet.InternetAddress 類。若建立的地址只包含電子郵件地址,只要傳遞電子郵件地址到構造器就好了。

Authenticator 認證者

​ 與 java 類同樣,JavaMail API 也能夠利用 Authenticator 經過用戶名和密碼訪問受保護的資源。對於 JavaMail API 來講,這些資源就是郵件服務器。JavaMail Authenticator 在 javax.mail 包中,並且它和 java.net 中同名的類 Authenticator 不一樣。二者並不共享同一個 Authenticator,由於 JavaMail API 用於 Java 1.1,它沒有 java.net 類別。要使用 Authenticator,先建立一個抽象類的子類,並從 getPasswordAuthentication() 方法中返回 PasswordAuthentication 實例。建立完成後,您必需向 session 註冊 Authenticator。而後,在須要認證的時候,就會通知 Authenticator。您能夠彈出窗口,也能夠從配置文件中(雖然沒有加密是不安全的)讀取用戶名和密碼,將它們做爲 PasswordAuthentication 對象返回給調用程序。

Java Mail 環境準備

設置郵箱服務

這裏是以163郵箱爲例

註冊 163 郵箱,登陸 163 郵箱後,設置郵箱帳戶開通 smtp 服務

​ 須要根據註冊時的手機號發送的驗證碼來開通獲取郵箱客戶端受權碼。開通成功後,會顯示我的受權訪問碼,該受權碼是後面經過 Java mail 發送郵件的認證密碼,很是重要。

添加依賴

建立 Maven 項目,在 pom.xml 配置文件中添加 mail 的所需的依賴

<!-- Java Mail -->
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.6.2</version>
</dependency>

Java Mail 發送郵件

發送普通文本的郵件

package com.xxxx.mail;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;

/**
 * 發送普通文本的郵件
 */
public class MailTest01 {

    public static void main(String[] args) throws Exception {

        // 定義郵箱服務器配置
        Properties prop = new Properties();
        // 設置郵件服務器主機名 (163 郵件服務器地址:"mail.smtp.host"  "smtp.163.com")
        prop.setProperty("mail.smtp.host", "smtp.163.com");
        // 設置郵件服務器的端口
        prop.setProperty("mail.smtp.port", "25");
        // 設置郵件服務器認證屬性 (設置爲true表示發送服務器須要身份驗證)
        prop.setProperty("mail.smtp.auth", "true");
        // 某些郵箱服務器要求 SMTP 鏈接須要使用 SSL 安全認證
        // prop.setProperty("mail.smtp.port", "465");
        // prop.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        // prop.setProperty("mail.smtp.socketFactory.fallback", "false");
        // prop.setProperty("mail.smtp.socketFactory.port", "465");

        // 使用JavaMail發送郵件的5個步驟
        // 1. 建立session
        Session session = Session.getInstance(prop);
        // 開啓Session的debug模式,這樣就能夠查看到程序發送Email的運行狀態
        session.setDebug(true);
        // 2. 經過session獲得transport對象
        Transport ts = session.getTransport();
        // 3. 使用郵箱的用戶名和密碼連上郵件服務器(用戶名只需寫@前面的便可,密碼是指受權碼)
        ts.connect("smtp.163.com", "用戶名", "密碼");
        // 4. 建立郵件
        // 發送普通文本的郵件
        Message message = createSimpleTxtMail(session);
        
        // 5. 發送郵件
        ts.sendMessage(message, message.getAllRecipients());
        // 關閉transport對象
        ts.close();

    }

    /**
     * 普通文本郵件
     *      建立一封只包含文本的郵件
     * @param session
     * @return
     */
    public static MimeMessage createSimpleTxtMail(Session session) throws MessagingException {
        // 建立郵件對象
        MimeMessage message = new MimeMessage(session);
        // 設置郵件的發件人的郵箱地址
        message.setFrom(new InternetAddress("發件人的郵箱地址"));
        // 設置郵件的收件人的郵箱地址 (如今發件人和收件人是同樣的,那就是本身給本身發)
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人的郵箱地址"));

        // 發送給多個收件人
        // message.setRecipients(Message.RecipientType.TO, new InternetAddress[] {});
        // Cc: 抄送(可選)
        // message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress(""));
        // Bcc: 密送(可選)
        // message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress(""));

        // 郵件的主題
        message.setSubject("測試文本郵件");
        // 設置發送日期
        message.setSentDate(new Date());
        // 郵件的文本內容 (setText():純文本內容)
        message.setText("你好,這是一封測試郵件!");

        // 返回建立好的郵件對象
        return message;
    }
}

效果以下:

發送HTML內容的郵件

package com.xxxx.mail;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Date;
import java.util.Properties;

/**
 * 發送HTML內容的郵件
 */
public class MailTest02 {

    public static void main(String[] args) throws Exception {

        // 定義郵箱服務器配置
        Properties prop = new Properties();
        // 設置郵件服務器主機名 (163 郵件服務器地址:"mail.smtp.host"  "smtp.163.com")
        prop.setProperty("mail.smtp.host", "smtp.163.com");
        // 設置郵件服務器的端口
        prop.setProperty("mail.smtp.port", "25");
        // 設置郵件服務器認證屬性 (設置爲true表示發送服務器須要身份驗證)
        prop.setProperty("mail.smtp.auth", "true");

        // 使用JavaMail發送郵件的5個步驟
        // 1. 建立session
        Session session = Session.getInstance(prop);
        // 開啓Session的debug模式,這樣就能夠查看到程序發送Email的運行狀態
        session.setDebug(true);
        // 2. 經過session獲得transport對象
        Transport ts = session.getTransport();
        // 3. 使用郵箱的用戶名和密碼連上郵件服務器(用戶名只需寫@前面的便可,密碼是指受權碼)
        ts.connect("smtp.163.com", "用戶名", "密碼");
        // 4. 建立郵件
        // 發送HTML內容的郵件
        Message message = createHtmlMail(session);
       
        // 5. 發送郵件
        ts.sendMessage(message, message.getAllRecipients());
        // 關閉transport對象
        ts.close();

    }

    /**
     * HTML內容郵件
     *      建立一封包含html內容的郵件
     */
    public static MimeMessage createHtmlMail(Session session) throws Exception {

        // 建立郵件對象
        MimeMessage message = new MimeMessage(session);
        // 設置郵件的發件人的郵箱地址
        message.setFrom(new InternetAddress("發件人的郵箱地址"));
        // 設置郵件的收件人的郵箱地址 (如今發件人和收件人是同樣的,那就是本身給本身發)
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人的郵箱地址"));
        // 郵件的主題
        message.setSubject("測試HTML郵件");
        // 設置發送日期
        message.setSentDate(new Date());

        // 準備郵件數據
        /**
         * Message表示一個郵件,messgaes.getContent()返回一個Multipart對象。
         * 一個Multipart對象包含一個或多個BodyPart對象,來組成郵件的正文部分(包括附件)。
         */
        // 建立多媒體對象
        MimeMultipart multipart = new MimeMultipart();

        // 建立郵件體對象
        MimeBodyPart bodyPart = new MimeBodyPart();
        // 設置HTML內容
        StringBuffer sb = new StringBuffer();
        sb.append("<html><body><a href='http://www.baidu.com'>百度一下</a></body></html>");
        bodyPart.setContent(sb.toString(), "text/html;charset=UTF-8");

        // 將bodyPart對象設置到multipart對象中
        multipart.addBodyPart(bodyPart);
        // 將multipart對象設置到message對象中 (setContent():)
        message.setContent(multipart);

        // 返回建立好的郵件對象
        return message;
    }   
}

效果以下:

發送包含附件的郵件

package com.xxxx.mail;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Date;
import java.util.Properties;

/**
 * 發送包含附件的郵件
 */
public class MailTest03 {

    public static void main(String[] args) throws Exception {

        // 定義郵箱服務器配置
        Properties prop = new Properties();
        // 設置郵件服務器主機名 (163 郵件服務器地址:"mail.smtp.host"  "smtp.163.com")
        prop.setProperty("mail.smtp.host", "smtp.163.com");
        // 設置郵件服務器的端口
        prop.setProperty("mail.smtp.port", "25");
        // 設置郵件服務器認證屬性 (設置爲true表示發送服務器須要身份驗證)
        prop.setProperty("mail.smtp.auth", "true");

        // 使用JavaMail發送郵件的5個步驟
        // 1. 建立session
        Session session = Session.getInstance(prop);
        // 開啓Session的debug模式,這樣就能夠查看到程序發送Email的運行狀態
        session.setDebug(true);
        // 2. 經過session獲得transport對象
        Transport ts = session.getTransport();
        // 3. 使用郵箱的用戶名和密碼連上郵件服務器(用戶名只需寫@前面的便可,密碼是指受權碼)
        ts.connect("smtp.163.com", "用戶名", "密碼");
        // 4. 建立郵件
        // 發送包含附件的郵件
        Message message = createAttachMail(session);
        
        // 5. 發送郵件
        ts.sendMessage(message, message.getAllRecipients());
        // 關閉transport對象
        ts.close();

    }

    /**
     * 包含附件的郵件
     *      建立一封包含附件的郵件
     * @param session
     * @return
     * @throws MessagingException
     */
    public static MimeMessage createAttachMail(Session session) throws MessagingException {
        // 建立郵件對象
        MimeMessage message = new MimeMessage(session);
        // 設置郵件的發件人的郵箱地址
        message.setFrom(new InternetAddress("發件人的郵箱地址"));
        // 設置郵件的收件人的郵箱地址 (如今發件人和收件人是同樣的,那就是本身給本身發)
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人的郵箱地址"));
        // 郵件的主題
        message.setSubject("測試包含附件的郵件");
        // 設置發送日期
        message.setSentDate(new Date());

        // 建立郵件正文
        MimeBodyPart bodyPart = new MimeBodyPart();
        bodyPart.setContent("使用JavaMail建立的帶附件的郵件", "text/html;charset=UTF-8");

        // 建立附件
        MimeBodyPart attachPart = new MimeBodyPart();
        // 本地文件
        DataHandler dh = new DataHandler(new FileDataSource("C:work郵件附件.txt"));
        attachPart.setDataHandler(dh);
        // 附件名
        attachPart.setFileName(dh.getName());

        // 建立容器描述數據關係
        MimeMultipart multipart = new MimeMultipart();
        // 添加正文
        multipart.addBodyPart(bodyPart);
        // 添加附件
        multipart.addBodyPart(attachPart);
        // 若是在郵件中要添加附件,設置爲mixed;。
        multipart.setSubType("mixed");

        // 設置郵件的內容
        message.setContent(multipart);

        // 返回建立好的郵件對象
        return message;
    }
}

效果以下:

Java Mail 郵件發送封裝

建立郵件發送信息類

package com.xxxx.mail;

import java.util.List;

/**
 * 郵件發送信息類
 *   定義發送郵件時 郵件服務器 端口 發送方用戶名 密碼等字段
 */
public class MailSendInfo {

    private String serverHost; // 服務器主機
    private String serverPort; // 服務器端口

    private String fromAddress;// 發送方郵箱地址
    private List<String> toAddress; // 接收方郵箱地址

    private String userName; // 郵件服務器用戶名
    private String userPwd; // 郵件服務器密碼(受權密碼)

    private String subject; // 郵件主題
    private String content; // 郵件內容

    private Boolean flag = true; // 是否須要身份認證

    private List<String> attachFileNames; // 附件文件名

    public Boolean getFlag() {
        return flag;
    }
    public void setFlag(Boolean flag) {
        this.flag = flag;
    }
    public String getServerHost() {
        return serverHost;
    }
    public void setServerHost(String serverHost) {
        this.serverHost = serverHost;
    }
    public String getServerPort() {
        return serverPort;
    }
    public void setServerPort(String serverPort) {
        this.serverPort = serverPort;
    }
    public String getFromAddress() {
        return fromAddress;
    }
    public void setFromAddress(String fromAddress) {
        this.fromAddress = fromAddress;
    }
    public List<String> getToAddress() {
        return toAddress;
    }
    public void setToAddress(List<String> toAddress) {
        this.toAddress = toAddress;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserPwd() {
        return userPwd;
    }
    public void setUserPwd(String userPwd) {
        this.userPwd = userPwd;
    }
    public String getSubject() {
        return subject;
    }
    public void setSubject(String subject) {
        this.subject = subject;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public List<String> getAttachFileNames() {
        return attachFileNames;
    }
    public void setAttachFileNames(List<String> attachFileNames) {
        this.attachFileNames = attachFileNames;
    }
}

建立認證類

package com.xxxx.mail;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

/**
 * 認證類
 */
public class MyAuthenticator extends Authenticator {

    private String userName; // 郵箱
    private String userPwd; // 密碼(受權碼)
    public MyAuthenticator(String userName, String userPwd) {
        this.userName = userName;
        this.userPwd = userPwd;
    }

    /**
     * 郵件服務器發送郵件時,進行身份驗證
     * @return
     */
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName, userPwd);
    }
}

建立郵件發送器

package com.xxxx.mail;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Properties;

public class MailSender {

    public void sendMail(MailSendInfo mailSendInfo){
        Message message = null;
        Session session = null;
        try {
            // 定義郵箱服務器配置
            Properties props = new Properties();
            // 163 郵件服務器地址
            props.put("mail.smtp.host", mailSendInfo.getServerHost());
            // 163 郵件服務器端口
            props.put("mail.smtp.port",mailSendInfo.getServerPort());
            // 163 郵件服務器認證屬性
            props.put("mail.smtp.auth", mailSendInfo.getFlag());
            // 身份認證類
            MyAuthenticator authenticator = new MyAuthenticator(mailSendInfo.getUserName(), mailSendInfo.getUserPwd());
            // 建立session
            session = Session.getDefaultInstance(props, authenticator);
            // 開啓Session的debug模式,這樣就能夠查看到程序發送Email的運行狀態
            session.setDebug(true);
            // 建立message郵件對象
            message = new MimeMessage(session);
            // 設置發送方的郵箱地址
            Address from = new InternetAddress(mailSendInfo.getFromAddress());
            message.setFrom(from);
            // 設置發送時間
            message.setSentDate(new Date());

            // 判斷接收方的郵箱地址
            if(null != mailSendInfo.getToAddress() && mailSendInfo.getToAddress().size() > 0){
                // 定義數組
                Address[] addresses = new Address[mailSendInfo.getToAddress().size()];
                // 循環獲取接收方的郵箱地址,並設置到對應的address數組中
                for(int i = 0; i < mailSendInfo.getToAddress().size(); i++){
                    Address address = new InternetAddress(mailSendInfo.getToAddress().get(i));
                    addresses[i] = address;
                }
                // 設置接收方的郵箱地址
                message.setRecipients(Message.RecipientType.TO, addresses);
                // 設置郵件主題
                message.setSubject(mailSendInfo.getSubject());

                // 建立多媒體對象容器
                Multipart multipart = new MimeMultipart();

                // 建立正文內容
                BodyPart bodyPart =new MimeBodyPart();
                bodyPart.setContent(mailSendInfo.getContent(),"text/html;charset=utf-8");
                // 添加正文 (將正文內容設置到多媒體對象容器中)
                multipart.addBodyPart(bodyPart);

                // 獲取全部的附件內容
                List<String> files = mailSendInfo.getAttachFileNames();
                // 判斷是否包含附件內容
                if(null != files && files.size() > 0){
                    for(int i = 0; i < files.size(); i++){
                        // 獲取對應的附件對象
                        File tempFile = new File(files.get(i));
                        // 判斷附件是否存在
                        if(tempFile.exists()){
                            // 若是附件存在,建立附件對象
                            BodyPart attachPart = new MimeBodyPart();
                            attachPart.setDataHandler(new DataHandler(new FileDataSource(tempFile)));
                            // 設置文件名 (解決附件名亂碼)
                            attachPart.setFileName(MimeUtility.encodeText(tempFile.getName()));
                            // 添加附件 (將附件內容添加到多媒體對象容器中)
                            multipart.addBodyPart(attachPart);
                        }
                    }
                }

                // 設置郵件內容
                message.setContent(multipart);
                // 發送郵件
                Transport.send(message);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

郵件發送測試

發送HTML內容的郵件
/**
  * 發送HTML內容的郵件
  */
public static void testHtmlMail() {
    MailSendInfo mailSendInfo = new MailSendInfo();
    mailSendInfo.setServerHost("smtp.163.com");
    mailSendInfo.setServerPort("25");
    mailSendInfo.setUserName("郵箱用戶名");
    mailSendInfo.setUserPwd("密碼(受權碼)");
    mailSendInfo.setSubject("郵件封裝");
    mailSendInfo.setFromAddress("發件人的郵箱地址");
    mailSendInfo.setContent("<h2>這是封裝後發送的郵件</h2>");
    List<String> users = new ArrayList<>();
    users.add("收件人的郵箱地址");
    mailSendInfo.setToAddress(users);
    MailSender mailSender=new MailSender();
    mailSender.sendMail(mailSendInfo);
}

效果以下:

發送包含附件的郵件
/**
  * 發送包含附件的郵件
  */
public static void testAttachMail() {
    MailSendInfo mailSendInfo = new MailSendInfo();
    mailSendInfo.setServerHost("smtp.163.com");
    mailSendInfo.setServerPort("25");
    mailSendInfo.setUserName("用戶名");
    mailSendInfo.setUserPwd("密碼(受權碼)");
    mailSendInfo.setSubject("郵件封裝");
    mailSendInfo.setFromAddress("發件人的郵箱地址");
    mailSendInfo.setContent("<h2>包含附件的郵件</h2>");
    List<String> users = new ArrayList<>();
    users.add("收件人的郵箱地址");
    mailSendInfo.setToAddress(users);

    // 添加附件
    List<String> files=new ArrayList<String>();
    files.add("C:work郵件附件.txt");
    files.add("C:work名單.xlsx");
    mailSendInfo.setAttachFileNames(files);
    MailSender mailSender=new MailSender();
    mailSender.sendMail(mailSendInfo);
}

效果以下:

使用 Spring API 實現郵件發送

環境準備

建立 Maven 項目,在 pom.xml 文件中添加依賴

<!-- spring核心 jar 依賴 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.4.RELEASE</version>
</dependency>
<!--spring 上下文環境 支持-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.2.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.2.4.RELEASE</version>
    <scope>test</scope>
</dependency>
<!-- Java Mail座標依賴 -->
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

配置郵件發送 bean

在 spring.xml 配置文件中設置郵件發送對應的bean標籤

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 開啓自動化掃描  -->
    <context:component-scan base-package="com.xxxx"/>

    <!-- 郵件發送器(提供了郵件發送接口、透明建立Java Mail的MimeMessage、及郵件發送的配置) -->
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="smtp.163.com" />
        <property name="port" value="25" />
        <property name="defaultEncoding" value="utf-8"></property>
        <property name="username" value="用戶名"></property>
        <property name="password" value="密碼"></property>
    </bean>

    <!-- 普通文本郵件對象 -->
    <bean id="templateMessage" class="org.springframework.mail.SimpleMailMessage">
        <property name="from" value="發件人的郵箱地址" />
        <property name="subject" value="spring_mail" />
    </bean>

</beans>

定義接口與實現類

定義接口

package com.xxxx.springMail;

/**
 * 定義接口
 */
public interface OrderManager {
    void placeOrder();
}

定義實現類

package com.xxxx.springMail;

import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;

@Service
public class SimpleOrderManager implements OrderManager {

    @Resource
    private JavaMailSenderImpl mailSender;
    @Resource
    private SimpleMailMessage templateMessage;

    @Override
    public void placeOrder() {
        // 獲取郵件對象
        SimpleMailMessage msg = new SimpleMailMessage(this.templateMessage);
        // 設置郵件收件人的郵箱地址
        msg.setTo("收件人的郵箱地址");
        // 設置郵件內容
        msg.setText("Hello Spring Mail");
        try{
            // 發送郵件
            this.mailSender.send(msg);
        } catch (MailException ex) {
            System.err.println(ex.getMessage());
        }
    }
}

郵件發送測試

/**
  *  發送郵件
  * @param args
  */
public static void main(String[] args) {
    ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml");
    SimpleOrderManager simpleOrderManager = 
        (SimpleOrderManager) ac.getBean("simpleOrderManager");
    simpleOrderManager.placeOrder();
}

發送附件

/**
  *  發送包含附件的郵件
  * @param args
  * @throws MessagingException
  */
public static void main(String[] args) throws MessagingException {
    ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
    JavaMailSender mailSender= (JavaMailSender) ac.getBean("mailSender");
    MimeMessage message= mailSender.createMimeMessage();
    message.setSubject("spring_mail"); // 郵件主題
    // 建立帶有附件的消息幫組類
    MimeMessageHelper helper = new MimeMessageHelper(message,true,"utf-8");
    helper.setTo(new InternetAddress("收件人的郵箱地址"));//設置接收人
    helper.setText("Thank you for ordering!"); // 郵件內容
    helper.setFrom("發件人的郵箱地址"); // 發件人
    // 設置附件
    File file = new File("C:work郵件附件.txt");
    // 添加附件
    helper.addAttachment(file.getName(), file);
    // 發送郵件
    mailSender.send(message);
}
相關文章
相關標籤/搜索