本文介紹使用 Javamail 通過 SMTP 協議發信。
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
範例程式碼:
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;
import java.util.UUID;
//import java.util.HashMap;
//import java.util.Base64;
//import com.google.gson.GsonBuilder;
//import javax.activation.DataHandler;
//import javax.activation.FileDataSource;
//import java.net.URL;
//import java.net.URLEncoder;
//import javax.activation.DataHandler;
//import javax.activation.URLDataSource;
public class SampleMail {
protected static String genMessageID(String mailFrom) {
// message-id 用於唯一地標識每一封郵件,其格式需要遵循RFC 5322標準,通常如 <uniquestring@example.com>,其中uniquestring是郵件伺服器產生的唯一標識,可能包含時間戳記、隨機數等資訊。
String[] mailInfo = mailFrom.split("@");
String domain = mailFrom;
int index = mailInfo.length - 1;
if (index >= 0) {
domain = mailInfo[index];
}
UUID uuid = UUID.randomUUID();
StringBuffer messageId = new StringBuffer();
messageId.append('<').append(uuid.toString()).append('@').append(domain).append('>');
return messageId.toString();
}
public static void main(String[] args) {
// 配置發送郵件的環境屬性
final Properties props = new Properties();
// 表示SMTP發送郵件,需要進行身分識別驗證
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.host", "smtpdm.aliyun.com");
//設定連接埠:
props.put("mail.smtp.port", "80");//或"25", 如果使用ssl,則去掉使用80或25連接埠的配置,進行如下配置:
//加密方式:
//props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
//props.put("mail.smtp.socketFactory.port", "465");
//props.put("mail.smtp.port", "465");
props.put("mail.smtp.from", "發信地址"); //mailfrom 參數
props.put("mail.user", "發信地址");// 寄件者的帳號(在控制台建立的發信地址)
props.put("mail.password", "SMTP密碼");// 發信地址的smtp密碼(在控制台選擇發信地址進行設定)
//props.setProperty("mail.smtp.ssl.enable", "true"); //請配合465連接埠使用
System.setProperty("mail.mime.splitlongparameters", "false");//用於解決附件名過長導致的顯示異常
//props.put("mail.smtp.connectiontimeout", 1000);
// 構建授權資訊,用於進行SMTP進行身分識別驗證
Authenticator authenticator = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 使用者名稱、密碼
String userName = props.getProperty("mail.user");
String password = props.getProperty("mail.password");
return new PasswordAuthentication(userName, password);
}
};
//使用環境屬性和授權資訊,建立郵件會話
Session mailSession = Session.getInstance(props, authenticator);
//mailSession.setDebug(true);//開啟debug模式
final String messageIDValue = genMessageID(props.getProperty("mail.user"));
//建立郵件訊息
MimeMessage message = new MimeMessage(mailSession) {
@Override
protected void updateMessageID() throws MessagingException {
//設定自訂Message-ID值
setHeader("Message-ID", messageIDValue);//建立Message-ID
}
};
try {
// 設定寄件者郵件地址和名稱。填寫控制台配置的發信地址。和上面的mail.user保持一致。名稱使用者可以自訂填寫。
InternetAddress from = new InternetAddress("發信地址", "寄件者名稱");//from 參數,可實現代發,注意:代發容易被收信方拒信或進入垃圾箱。
message.setFrom(from);
//可選。設定回信地址
Address[] a = new Address[1];
a[0] = new InternetAddress("收信地址");
message.setReplyTo(a);
// 設定收件者郵件地址
InternetAddress to = new InternetAddress("收信地址");
message.setRecipient(MimeMessage.RecipientType.TO, to);
//如果同時發給多人,才將上面兩行替換為如下(因為部分收信系統的一些限制,盡量每次投遞給一個人;同時我們限制單次允許發送的人數,具體參考規格清單):
//InternetAddress[] adds = new InternetAddress[2];
//adds[0] = new InternetAddress("收信地址");
//adds[1] = new InternetAddress("收信地址");
//message.setRecipients(Message.RecipientType.TO, adds);
message.setSentDate(new Date()); //設定時間
String ccUser = "抄送地址";
// 設定多個抄送地址
if (null != ccUser && !ccUser.isEmpty()) {
@SuppressWarnings("static-access")
InternetAddress[] internetAddressCC = new InternetAddress().parse(ccUser);
message.setRecipients(Message.RecipientType.CC, internetAddressCC);
}
String bccUser = "密送地址";
// 設定多個密送地址
if (null != bccUser && !bccUser.isEmpty()) {
@SuppressWarnings("static-access")
InternetAddress[] internetAddressBCC = new InternetAddress().parse(bccUser);
message.setRecipients(Message.RecipientType.BCC, internetAddressBCC);
}
//設定郵件標題
message.setSubject("測試主題");
message.setContent("測試<br> 內容", "text/html;charset=UTF-8");//html超文本;// "text/plain;charset=UTF-8" //純文字。
// //若需要開啟郵件Tracing Service,請使用以下代碼設定跟蹤連結頭。前置條件和約束見文檔"如何開啟資料跟蹤功能?"
// String tagName = "Test";
// HashMap<String, String> trace = new HashMap<>();
// //這裡為字串"1"
// trace.put("OpenTrace", "1"); //開啟郵件跟蹤
// trace.put("LinkTrace", "1"); //點擊郵件裡的URL跟蹤
// trace.put("TagName", tagName); //控制台建立的標籤tagname
// String jsonTrace = new GsonBuilder().setPrettyPrinting().create().toJson(trace);
// //System.out.println(jsonTrace);
// String base64Trace = new String(Base64.getEncoder().encode(jsonTrace.getBytes()));
// //設定跟蹤連結頭
// message.addHeader("X-AliDM-Trace", base64Trace);
// //郵件eml原文中的樣本值:X-AliDM-Trace: eyJUYWdOYW1lIjoiVGVzdCIsIk9wZW5UcmFjZSI6IjEiLCJMaW5rVHJhY2UiOiIxIn0=
//發送附件和內容:
// BodyPart messageBodyPart = new MimeBodyPart();
// //messageBodyPart.setText("訊息<br>Text");//設定郵件的內容,文本
// messageBodyPart.setContent("測試<br> 內容", "text/html;charset=UTF-8");// 純文字:"text/plain;charset=UTF-8" //設定郵件的內容
// //建立多重訊息
// Multipart multipart = new MimeMultipart();
// //設定簡訊部分
// multipart.addBodyPart(messageBodyPart);
// //附件部分
// //發送附件,總的郵件大小不超過15M,建立訊息部分。
//發送本地附件
// String[] fileList = new String[2];
// fileList[0] = "C:\\Users\\test1.txt";
// fileList[1] = "C:\\Users\\test2.txt";
// for (int index = 0; index < fileList.length; index++) {
// MimeBodyPart mimeBodyPart = new MimeBodyPart();
// // //設定要發送附件的檔案路徑
// FileDataSource filesdata = new FileDataSource(fileList[index]);
// mimeBodyPart.setDataHandler(new DataHandler(filesdata));
// //處理附件名稱中文(附帶檔案路徑)亂碼問題
// mimeBodyPart.setFileName(MimeUtility.encodeWord("自訂附件名.xlsx"));
// mimeBodyPart.addHeader("Content-Transfer-Encoding", "base64");
// multipart.addBodyPart(mimeBodyPart);
// }
//發送URL附件
// String[] fileList = new String[2];
// fileList[0] = "https://example.oss-cn-shanghai.aliyuncs.com/xxxxxxxxxxx1.png";
// fileList[1] = "https://example.oss-cn-shanghai.aliyuncs.com/xxxxxxxxxxx2.png";
// for (int index = 0; index < fileList.length; index++) {
// String encode = URLEncoder.encode(fileList[index], "UTF-8");
// MimeBodyPart mimeBodyPart = new MimeBodyPart();
// mimeBodyPart.setDataHandler(new DataHandler(new URLDataSource(new URL(encode.replace("%3A",":").replace("%2F","/")))));
// mimeBodyPart.setFileName(MimeUtility.encodeText("自訂附件名.xlsx"));
// multipart.addBodyPart(mimeBodyPart);
// }
// //發送含有附件的完整訊息
// message.setContent(multipart);
// // 發送附件代碼,結束
// 發送郵件
Transport.send(message);
} catch (MessagingException e) {
String err = e.getMessage();
// 在這裡處理message內容, 格式是固定的
System.out.println(err);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //catch (MalformedURLException e) {
// e.printStackTrace();
//}
}
}