詳細Spring如何進行郵件發送html
本文由樂字節Java架構課程獨家贊助播出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; } }
效果以下:數組
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; } }
效果以下:安全
!tMsjnU.png](https://imgchr.com/i/tMsjnU)
[服務器
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; } }
效果以下:session
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內容的郵件 */ 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); }
效果以下:app