基於JavaMail開發郵件發送器工具類


基於JavaMail開發郵件發送器工具類

在開發當中肯定會碰到利用Java調用郵件服務器的服務發送郵件的情況,比如賬號激活、找回密碼等功能。本人之前也碰到多次這樣需求,為此特意將功能封裝成一個簡單易用工具類,需要用郵件發送功能時,只需要調用相關的接口即可。本人也將該工具提交到了GitHub上(https://github.com/lzj09/mail-helper),供大家參考。接下來,簡單介紹一下該工具類及使用方法。

1、工程依賴

本工程主要依賴如下Jar:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.6.2</version>
</dependency>

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.23</version>
</dependency>

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

由於郵件發送是基於JavaMail的所以需要依賴JavaMail相關的Jar;

發送郵件的模板不僅支持簡單的文本內容,也支持html,同時郵件模板中的語法支持freemarker語法,所以需要freemarker相關Jar;

記錄日志信息,目前使用log4j。

2、核心類MailHelper

核心類MailHelper中最重要的send方法,即郵件發送方法,該方法的簽名為:

public static void send(SenderConfig sender, String receiver, String subject, String template, Map<String, Object> data) throws Exception

該方法有5個參數,分別是:

  • SenderConfig sender:郵件發送賬號的配置信息,配置信息有:

    // 用戶名
    private String username;
    // 密碼
    private String password;
    // 昵稱
    private String nickname;
    // smtp服務主機名
    private String smtpHost;
    // smtp服務端口
    private String smtpPort;
    // 是否開啟ssl
    private boolean isSsl;
    

    其實最主要就是smtp的配置信息

  • String receiver:郵件接收者郵箱地址

  • String subject:郵件的主題,也即在郵件列表上顯示的名稱

  • String template:郵件模板內容,支持freemarker語法

  • Map<String, Object> data:郵件模板中需要替換的數據內容

該方法的實現為:

// 將SenderConfig配置信息轉換成Properties
Properties prop = wrapProperties(sender);

// 獲取權限配置
AuthConfig auth = getAuthConfig(sender);

// 構建郵件會話
Session mailSession = Session.getDefaultInstance(prop, auth);  
mailSession.setDebug(false); 

// 構建郵件消息
Message mailMessage = new MimeMessage(mailSession);

// 設置昵稱
String nick = MimeUtility.encodeText(getNickname(sender));
Address from = new InternetAddress(nick + " <" + sender.getUsername() + ">"); 
mailMessage.setFrom(from);

// 設置郵件接收者
Address to = new InternetAddress(receiver);
mailMessage.setRecipient(Message.RecipientType.TO, to);  

// 設置郵件主題
mailMessage.setSubject(subject);

// 設置發送時間
mailMessage.setSentDate(new Date());

// 設置郵件內容
Multipart mainPart = new MimeMultipart();
// 內容是可以包含html
BodyPart html = new MimeBodyPart();
html.setContent(getContent(template, data), "text/html; charset=utf-8");
mainPart.addBodyPart(html);
mailMessage.setContent(mainPart);

// 發送郵件  
Transport.send(mailMessage);

3、測試

利用郵件發送的工具類測試將郵件發送出去:

首先准備需要發送的郵件模板:test.html

<!doctype html>
<html>
    <head>
        <title>測試郵件</title>
        <meta charset="utf-8">
    </head>
    
    <body>
        <h2>${name}</h2>
        <div>${description}</div>
    </body>
</html>

其中模板中放置了2個占位符,分別是${name}和${description}

構建測試例子:

// 配置郵件發送信息
SenderConfig sender = new SenderConfig();
sender.setNickname("架構與我");
// 改成自己的郵件帳號
sender.setUsername("xxx@163.com");
// 改成自己的郵件密碼
sender.setPassword("xxx");
sender.setSmtpHost("smtp.163.com");
sender.setSmtpPort("25");
sender.setSsl(false);

// 獲取郵件模板
File tpl = new File("src/test/resources/test.html");
StringBuilder builder = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(tpl), "utf-8"));) {
    String line = null;
    while ((line = reader.readLine()) != null) {
        builder.append(line);
    }
}

// 測試數據
Map<String, Object> data = new HashMap<String, Object>();
data.put("name", "架構與我");
data.put("description", "專注大數據、微服務架構、高並發高吞吐量大型網站、移動開發。");

// 測試發送郵件
// 改成自己的接收郵件地址
MailHelper.send(sender, "xxx@qq.com", "來自架構與我的郵件", builder.toString(), data);

發送成功后,可以看到接收郵箱的內容如下:

該郵件昵稱和主題都是按我們的設置顯示出來了,打開郵件內容如下:

可以看到模板當中占位符內容也替換成了我們設置的數據。

關注我

以你最方便的方式關注我:
微信公眾號:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM