javaMail是java發送郵件的工具包,在有網情況下使用javaMail即可發送一封郵件。
主要流程
創建一個mailUtil類,裏面包含方法
- 創建發雜郵件單獨節點
- getMailContentImage 創建圖片,正文中引用
- getMailContentText 創建文本,應用圖片
- getMailContentAttachment 創建上傳附件
- 合併多個節點爲複雜郵件內容
- getMailContentMultipart 合併多個節點爲混合節點,即 正文內容
- 創建複雜郵件
- createComplexMimeMessage
- 創建簡單郵件
- createSimpleMimeMessage
- 發送複雜郵件
- sendMail(重載方法)
- 發送簡單郵件
- sendMail(重載方法)
創建測試類
- 調用mailUtil類進行測試
- 設置參數
- 調用方法
測試環境
- 普通java項目即可,電腦鏈接網絡,將參數設置爲自己的郵箱和密碼即可運行測試
代碼
mailUtil代碼如下
package com.lushunde.util;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.MessagingException;
import javax.mail.Multipart;
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.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
public class MailUtil {
/**
* 發送一封郵件的過程
* @param smtpHost smtp服務,一般爲smtp.163.com smtp.qq.com
* @param sendMail 發件人郵箱地址 一般爲smtp對應
* @param receiveMail 接收人郵箱地址,可以是任意的合法郵箱即可
* @param mailSubject 創建的郵件主題
* @param mailContent 創建郵件的內容,可以添加html標籤
* @param sentDate 設置發送時間,null爲立即發送
* @param authUserName 驗證服務器是的用戶名,一般和發件人郵箱保持一致
* @param authPassword 驗證服務器的密碼,一般爲登錄郵箱的密碼,也可能是郵箱獨立密碼
* @throws Exception
*/
public static void sendMail(String smtpHost,String sendMail,String sendNickname, String receiveMail,String receiveNickname,String mailSubject,String mailContent,Date sentDate,String authUserName,String authPassword ) throws Exception {
// 1. 創建參數配置, 用於連接郵件服務器的參數配置
Properties props = new Properties(); // 參數配置
props.setProperty("mail.transport.protocol", "smtp"); // 使用的協議(JavaMail規範要求)
props.setProperty("mail.smtp.host", smtpHost); // 發件人的郵箱的 SMTP 服務器地址
props.setProperty("mail.smtp.auth", "true"); // 需要請求認證
// 2. 根據配置創建會話對象, 用於和郵件服務器交互
Session session = Session.getDefaultInstance(props);
session.setDebug(true); // 設置爲debug模式, 可以查看詳細的發送 log,開發時候使用
// 3. 創建一封郵件
MimeMessage message = createMimeMessage(session, sendMail , sendNickname, receiveMail, receiveNickname, mailSubject, mailContent, sentDate);
// 4. 根據 Session 獲取郵件傳輸對象
Transport transport = session.getTransport();
// 5. 使用 郵箱賬號 和 密碼 連接郵件服務器, 這裏認證的郵箱必須與 message 中的發件人郵箱一致, 否則報錯
// PS_02: 連接失敗的原因通常爲以下幾點, 仔細檢查代碼:
// (1) 郵箱沒有開啓 SMTP 服務;
// (2) 郵箱密碼錯誤, 例如某些郵箱開啓了獨立密碼;
// (3) 郵箱服務器要求必須要使用 SSL 安全連接;
// (4) 請求過於頻繁或其他原因, 被郵件服務器拒絕服務;
// (5) 如果以上幾點都確定無誤, 到郵件服務器網站查找幫助。
transport.connect(smtpHost,authUserName, authPassword);
// 6. 發送郵件, 發到所有的收件地址, message.getAllRecipients() 獲取到的是在創建郵件對象時添加的所有收件人, 抄送人, 密送人
transport.sendMessage(message, message.getAllRecipients());
// 7. 關閉連接
transport.close();
}
/**
* 發送一封郵件的過程
* @param smtpHost smtp服務,一般爲smtp.163.com smtp.qq.com
* @param sendMail 發件人郵箱地址 一般爲smtp對應
* @param sendNickname 發件人暱稱
* @param receiveMail 接收人郵箱地址,可以是任意的合法郵箱即可
* @param receiveNickname 接收人暱稱
* @param mailSubject 創建的郵件主題
* @param mimeMultipart 上傳一個複雜的郵件內容
* @param sentDate 設置發送時間,null爲立即發送
* @param authUserName 驗證服務器是的用戶名,一般和發件人郵箱保持一致
* @param authPassword 驗證服務器的密碼,一般爲登錄郵箱的密碼,也可能是郵箱獨立密碼
* @throws Exception
*/
public static void sendMail(String smtpHost,String sendMail,String sendNickname, String receiveMail,String receiveNickname,String mailSubject,MimeMultipart mimeMultipart,Date sentDate,String authUserName,String authPassword ) throws Exception {
// 1. 創建參數配置, 用於連接郵件服務器的參數配置
Properties props = new Properties(); // 參數配置
props.setProperty("mail.transport.protocol", "smtp"); // 使用的協議(JavaMail規範要求)
props.setProperty("mail.smtp.host", smtpHost); // 發件人的郵箱的 SMTP 服務器地址
props.setProperty("mail.smtp.auth", "true"); // 需要請求認證
// 2. 根據配置創建會話對象, 用於和郵件服務器交互
Session session = Session.getDefaultInstance(props);
session.setDebug(true); // 設置爲debug模式, 可以查看詳細的發送 log,開發時候使用
// 3. 創建一封郵件
MimeMessage message = createComplexMimeMessage(session, sendMail , sendNickname, receiveMail, receiveNickname, mailSubject, mimeMultipart, sentDate);
// 4. 根據 Session 獲取郵件傳輸對象
Transport transport = session.getTransport();
// 5. 使用 郵箱賬號 和 密碼 連接郵件服務器, 這裏認證的郵箱必須與 message 中的發件人郵箱一致, 否則報錯
// PS_02: 連接失敗的原因通常爲以下幾點, 仔細檢查代碼:
// (1) 郵箱沒有開啓 SMTP 服務;
// (2) 郵箱密碼錯誤, 例如某些郵箱開啓了獨立密碼;
// (3) 郵箱服務器要求必須要使用 SSL 安全連接;
// (4) 請求過於頻繁或其他原因, 被郵件服務器拒絕服務;
// (5) 如果以上幾點都確定無誤, 到郵件服務器網站查找幫助。
transport.connect(smtpHost,authUserName, authPassword);
// 6. 發送郵件, 發到所有的收件地址, message.getAllRecipients() 獲取到的是在創建郵件對象時添加的所有收件人, 抄送人, 密送人
transport.sendMessage(message, message.getAllRecipients());
// 7. 關閉連接
transport.close();
}
/**
* 創建一封只包含文本的簡單郵件
*
* @param session 和服務器交互的會話
* @param sendMail 發件人郵箱
* @param sendNickname 發送人暱稱
* @param receiveMail 收件人郵箱
* @param receiveNickname 收件人暱稱
* @param mailSubject 郵件主題
* @param receiveMail 郵件內容
* @param sendDate 設置發送時間,null爲立即發送
* @return MimeMessage 返回一份郵件
* @throws Exception
*/
public static MimeMessage createMimeMessage(Session session, String sendMail,String sendNickname, String receiveMail,String receiveNickname,String mailSubject,String mailContent,Date sentDate) throws Exception {
// 1. 創建一封郵件
MimeMessage message = new MimeMessage(session);
// 2. From: 發件人
message.setFrom(new InternetAddress(sendMail,sendNickname,"UTF-8"));
// 3. To: 收件人(可以增加多個收件人、抄送、密送)
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, receiveNickname, "UTF-8"));
// 4. Subject: 郵件主題
message.setSubject(mailSubject, "UTF-8");
// 5. Content: 郵件正文(可以使用html標籤)
message.setContent(mailContent, "text/html;charset=UTF-8");
// 6. 設置發件時間
message.setSentDate(sentDate!=null?sentDate:new Date());
// 7. 保存設置
message.saveChanges();
return message;
}
/**
* 創建一封複雜郵件(文本+圖片+附件)
*/
public static MimeMessage createComplexMimeMessage(Session session, String sendMail,String sendNickname, String receiveMail,String receiveNickname,String mailSubject,MimeMultipart mailContent,Date sentDate) throws Exception {
// 1. 創建郵件對象
MimeMessage message = new MimeMessage(session);
// 2. From: 發件人
message.setFrom(new InternetAddress(sendMail, sendNickname, "UTF-8"));
// 3. To: 收件人(可以增加多個收件人、抄送、密送)
message.addRecipient(RecipientType.TO, new InternetAddress(receiveMail, receiveNickname, "UTF-8"));
// 4. Subject: 郵件主題
message.setSubject(mailSubject, "UTF-8");
// 5. Content: 複雜郵件內容,有單獨方法創建,直接傳入
// 6. 設置整個郵件的關係(將最終的混合“節點”作爲郵件的內容添加到郵件對象)
message.setContent(mailContent);
// 7. 設置發件時間
message.setSentDate(sentDate!=null?sentDate:new Date());
// 8. 保存上面的所有設置
message.saveChanges();
return message;
}
/**
* 創建一個圖片節點,返回節點唯一編號,在文本中引用
* @param imagePath 需要添加到郵件正文文本中的圖片本地路徑
* @param only_image_ID 設置的圖片Id,只要是正文文本中引用圖片只需引用該ID即可
* @return MimeBodyPart 返回創建的圖片節點
* @throws MessagingException
*/
public static MimeBodyPart getMailContentImage(String imagePath,String only_image_ID) throws MessagingException{
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource(imagePath)); // 讀取本地文件
image.setDataHandler(dh); // 將圖片數據添加到“節點”
image.setContentID(only_image_ID); // 爲“節點”設置一個唯一編號(在文本“節點”將引用該ID)
return image;
}
/**
* 創建一個文本節點,其中添加創建的圖片節點對圖片進行引用
* @param content 文本,可以是已經飲用過的文本,例如"這是一張圖片<br/><img src='cid:only_image_ID'/>"
* @return MimeBodyPart 返回一個節點
* @throws MessagingException
*/
public static MimeBodyPart getMailContentText(String content) throws MessagingException{
MimeBodyPart text = new MimeBodyPart();
//這裏添加圖片的方式是將整個圖片包含到郵件內容中, 實際上也可以以 http 鏈接的形式添加網絡圖片
//text.setContent("這是一張圖片<br/><img src='cid:image_fairy_tail'/>", "text/html;charset=UTF-8");
text.setContent(content,"text/html;charset=UTF-8");
return text;
}
/**
* 創建一個附件節點,附件上傳文件
* @param attachmentPath 需要上傳到附件的文件的路徑
* @return MimeBodyPart 返回一個節點
* @throws MessagingException
* @throws UnsupportedEncodingException
*/
public static MimeBodyPart getMailContentAttachment(String attachmentPath) throws MessagingException, UnsupportedEncodingException{
MimeBodyPart attachment = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource(attachmentPath)); // 讀取本地文件
attachment.setDataHandler(dh); // 將附件數據添加到“節點”
attachment.setFileName(MimeUtility.encodeText(dh.getName())); // 設置附件的文件名(需要編碼)
return attachment;
}
/**
* 創建一個混合節點,添加所有的普通節點
* @param mimeBodyPart 傳入需要添加的普通節點數組
* @return MimeMultipart 混合節點
* @throws MessagingException
* @throws UnsupportedEncodingException
*/
public static MimeMultipart getMailContentMultipart(MimeBodyPart[] mimeBodyPart) throws MessagingException, UnsupportedEncodingException{
MimeMultipart mimeMultipart = new MimeMultipart();
for (int i = 0; i < mimeBodyPart.length; i++) {
mimeMultipart.addBodyPart(mimeBodyPart[i]);
}
return mimeMultipart;
}
}
測試類代碼如下
package com.lushunde.util;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
public class MailTest {
public static void main(String[] args) throws Exception {
String sendMail = "[email protected]"; // 發件人
String receiveMail = "[email protected]"; // 收件人
String authUserName = "[email protected]"; // 驗證賬戶
String authPassword = "xxxxxx"; // 驗證密碼
// 發送簡單郵件
senfSimpleMail(sendMail, receiveMail, authUserName, authPassword);
// 發送複雜 郵件
sendComplexmail(sendMail, receiveMail, authUserName, authPassword);
}
private static void sendComplexmail(String sendMail, String receiveMail, String authUserName, String authPassword)
throws Exception {
// 創建複雜郵件的正文
// 1.創建圖片,正文中引用
String imagePath = "C:\\Users\\base\\Desktop\\測試圖片.jpg";
String only_image_ID = "add_image_id";
MimeBodyPart image = MailUtil.getMailContentImage(imagePath, only_image_ID);
// 2.創建普通文本,添加引用圖片id
String content = "這是驗證郵件,您的圖片爲<img src='cid:add_image_id'/>";
MimeBodyPart text = MailUtil.getMailContentText(content);
// 3.創建一個附件
String attachmentPath = "C:\\Users\\base\\Desktop\\mail.rar";
MimeBodyPart attachment = MailUtil.getMailContentAttachment(attachmentPath);
// 4.創建一個混合節點,添加以上普通節點
MimeBodyPart[] mimeBodyPart = { image, text, attachment };
MimeMultipart mimeMultipart = MailUtil.getMailContentMultipart(mimeBodyPart);
MailUtil.sendMail("smtp.163.com", sendMail, null, receiveMail, null, "用戶賬戶激活", mimeMultipart, null,
authUserName, authPassword);
}
private static void senfSimpleMail(String sendMail, String receiveMail, String authUserName, String authPassword)
throws Exception {
MailUtil.sendMail("smtp.163.com", sendMail, null, receiveMail, null, "用戶賬戶激活",
"這是一份激活郵件,如本人註冊請點擊鏈接進行激活:</br><a href=\"http://localhost:8080/user/activate \">點擊激活</a>", null,
authUserName, authPassword);
}
}
測試結果
- 簡單郵箱如圖:(只有文本)
- 複雜郵箱如圖:(有附件,有圖片)