基於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);
發送成功后,可以看到接收郵箱的內容如下:
該郵件昵稱和主題都是按我們的設置顯示出來了,打開郵件內容如下:
可以看到模板當中占位符內容也替換成了我們設置的數據。
關注我
以你最方便的方式關注我:
微信公眾號: