[TOC] Java實現發郵件功能 前言 電子郵件的應用場景非常廣泛,例如新用戶加入,即時發送優惠清單、通過郵件找回密碼、監聽後臺程式,出現異常自動郵件通知等。 本文以網易郵箱為例,通過Java代碼實現發送郵件功能。 開發環境 請參照: "基於SpringBoot構建分模塊項目" 代碼 1. pom ...
目錄
Java實現發郵件功能
前言
電子郵件的應用場景非常廣泛,例如新用戶加入,即時發送優惠清單、通過郵件找回密碼、監聽後臺程式,出現異常自動郵件通知等。
本文以網易郵箱為例,通過Java代碼實現發送郵件功能。
開發環境
請參照: 基於SpringBoot構建分模塊項目
代碼
pom.xml引入依賴
<properties> <java.version>1.8</java.version> <!-- 你的其他依賴... --> <javax.mail.version>1.6.0</javax.mail.version> </properties> <dependencies> <!-- 你的其他依賴... --> <!-- 發送簡訊 --> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>${javax.mail.version}</version> </dependency> </dependencies>
發送郵件工具類
package com.wayne.common.utils; import com.wayne.common.entity.CmsMailConfig; import com.wayne.common.vo.MailVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Date; import java.util.Properties; /** * 發送郵件工具類 * @author Wayne * @date 2019/6/19 */ @Component public class MailUtils { /** * 發送郵件 * @param isSingle 是否單發: true-單發 false-群發 * @param mailVo 郵件內容 * @param sendTime 發送時間, 如果為null,表示立即發送 * @param mailConfig 發件人信息及授權 */ public void sendMail(Boolean isSingle, MailVo mailVo, Date sendTime, CmsMailConfig mailConfig) throws MessagingException { Session session = this.authenticationMail(); MimeMessage message = getMimeMessage(isSingle, session, mailConfig.getMailAccount(), mailVo.getRecipients()); message = getContent(message, mailVo.getMailTiTle(), mailVo.getMailContent(), sendTime); Transport transport = session.getTransport(); transport.connect(mailConfig.getMailAccount(), mailConfig.getMailLicense()); transport.sendMessage(message, message.getAllRecipients()); transport.close(); } /** * 校驗發送的郵件內容 */ private MimeMessage getContent(MimeMessage message, String messageTitle, String messageContent, Date sendTime) throws MessagingException { if (null == messageTitle) { throw new MessagingException("郵件標題不能為空"); } if (null == messageContent) { throw new MessagingException("郵件內容不能為空"); } sendTime = sendTime == null ? new Date() : sendTime; message.setSubject(messageTitle, "UTF-8"); message.setContent(messageContent, "text/html;charset=UTF-8"); message.setSentDate(sendTime); return message; } /** * 驗證認證信息 */ private Session authenticationMail() throws MessagingException { Session session; try { Properties props = new Properties(); //設置用戶的認證方式 props.setProperty("mail.smtp.auth", "true"); //設置傳輸協議 props.setProperty("mail.transport.protocol", "smtp"); //設置發件人的SMTP伺服器地址 props.setProperty("mail.smtp.host", "smtp.163.com"); session = Session.getInstance(props); session.setDebug(true); } catch (Exception e) { e.printStackTrace(); throw new MessagingException("認證失敗"); } return session; } /** * @param isSingle 是否單發 * <P>true-向指定的一個收件人發送郵件,比如:找回密碼、登錄驗證 * <P>false-向多個收件人群發郵件,比如:優惠活動推送 * <P>群發時多個收件人之間用英文逗號','分割 * @param senderAddress 發件人地址 * @param recipientAddress 收件人地址 */ private MimeMessage getMimeMessage(Boolean isSingle, Session session, String senderAddress, String recipientAddress) throws MessagingException { MimeMessage message = new MimeMessage(session); try { message.setFrom(new InternetAddress(senderAddress)); } catch (MessagingException e) { throw new MessagingException("發件人地址錯誤"); } /* 設置收件人地址 MimeMessage.RecipientType.TO:發送 MimeMessage.RecipientType.CC:抄送 MimeMessage.RecipientType.BCC:密送 */ if (isSingle) { message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(recipientAddress)); } else { message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipientAddress)); } return message; } }
郵件內容對象-MailVo
package com.wayne.common.vo; import lombok.Data; /** * @author Wayne * @date 2019/6/24 */ @Data public class MailVo { /** * 郵件標題 */ private String mailTiTle; /** * 郵件內容 */ private String mailContent; /** * 收件人(們) */ private String recipients; }
發件人信息及授權
註: 此處我假定有多個發件人,且不確定,可以動態添加、選擇由哪個發件人發送,因此我將發件人信息存儲在資料庫中。假如你的應用中發件人是固定的,則此處可寫在項目中或配在配置文件!
我們正常發送郵件時需要輸入密碼,登錄我們的郵箱賬戶。而通過程式發送郵件不需要密碼登錄,而是使用授權碼,網易郵箱授權碼獲得方式如下
- 啟用授權
- 獲得授權碼
package com.wayne.common.entity; import lombok.Data; import javax.persistence.*; @Data @Table(name = "cms_mail_config") public class CmsMailConfig { /** * 主鍵 */ @Id @Column(name = "MAIL_ID") private Integer mailId; /** * 郵箱賬號 */ @Column(name = "MAIL_ACCOUNT") private String mailAccount; /** * 授權碼 */ @Column(name = "MAIL_LICENSE") private String mailLicense; /** * 狀態,0:使用,1:未使用 */ @Column(name = "IS_USE") private String isUse; /** * 是否刪除,0:否,1:是 */ @Column(name = "IS_DELETE") private String isDelete; /** * 創建者ID */ @Column(name = "CREATE_ADMIN_ID") private Integer createAdminId; @Column(name = "EXTEND1") private String extend1; @Column(name = "EXTEND2") private String extend2; @Column(name = "EXTEND3") private String extend3; @Column(name = "EXTEND4") private String extend4; @Column(name = "EXTEND5") private String extend5; @Column(name = "EXTEND6") private String extend6; }
Service
@Override public ResponseBean sendMails(MailVo mailVo) { if (null == mailVo) { return ResponseBean.createInstance(Boolean.FALSE, 400, "參數異常"); } // 獲取當前正在使用的發件人配置 List<CmsMailConfig> mailConfigList = mailConfigMapper.selectCurrUseMailConfig(); if (null == mailConfigList || mailConfigList.size() != 1) { return ResponseBean.createInstance(Boolean.FALSE, 400, "參數異常"); } try { // 發送郵件 mailUtils.sendMail(Boolean.FALSE, mailVo, null, mailConfigList.get(0)); return ResponseBean.createInstance(); } catch (Exception e) { e.printStackTrace(); } return ResponseBean.createInstance(Boolean.FALSE, 400, "參數異常"); }
Controller
@PostMapping("/mail/sendMails") public ResponseBean sendMails(MailVo mailVo) { return mailService.sendMails(mailVo); }
效果
此處發送為手動發送,主要體驗代碼功能。具體應用場景可根據實際生產環境,隨機應變。比如:通過結合定時器任務,每天定時發送報表;檢測用戶登錄地址不是常用地址時,自動發郵件通知用戶;普通用戶登錄時,觸發發送郵件向管理員等
結束語
本人已開通公眾號,歡迎大家前來灌水