Java Mail 發送郵件
詳細Spring如何進行郵件發送
![]()
本文由樂字節Java架構課程獨家贊助播出
![]()
發送普通文本的郵件
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);
}
效果如下:
![]()