在實際開發中,需要有很多地方用到關聯郵件發送消息,比如注冊成功信息,找回密碼信息,或者通過郵件發送即將過期信息等等,所使用的應用場景很多很多,下面調用JavaMailSender發送郵件,
一、郵箱配置
首先需要我們注冊郵箱,並開啟二級密碼設置,最主要的是開啟郵箱的POP3/SMTP服務,這里以網易雲郵箱舉例,點擊設置——POP3/SMTP/IMAP
並開啟授權碼,類似下圖,這個授權碼要牢記,后面會用到
1.配置完成,新建項目,在spirngBoot工程的pom.xml中導入郵件所需依賴及其他項目所需依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
2.配置application.properties
spring.mail.host=smtp.163.com spring.mail.username=xxxxxxxxxxx@163.com spring.mail.password=IPRWWISBDJIYVSYV spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true spring.mail.default-encoding=UTF-8
host qq郵箱為smtp.qq.com 網易郵箱為smtp.163.com
username為郵箱賬號
password 特別注意這里password不代表郵箱的登錄密碼, 而是在剛開始生成的授權碼
auth 開啟權限驗證
starttls.enable 是否開啟加密通訊
starttls.required 是否必須開啟加密通訊
3.新建郵件格式實體類,以自己內容為主 發送人,主題,內容
public class EmailBean implements Serializable { private String[] receiver; private String subject; private String content;
public String[] getReceiver() {
return receiver;
}
public void setReceiver(String receiver) {
this.receiver = new String[] {receiver};
}
public void setReceiver(String... receiver) {
this.receiver = receiver;
}
..getter and setter }
4.新建郵件發送工具類
(1)、純文本格式郵件
@Component public class EmailUtil { @Value("${spring.mail.username}") private String sender; @Autowired JavaMailSender javaMailSender; public void sendPlainTextMail(EmailBean emailBean){ SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); simpleMailMessage.setFrom(sender); simpleMailMessage.setTo(emailBean.getReceiver()); simpleMailMessage.setSubject(emailBean.getSubject()); simpleMailMessage.setText(emailBean.getContent()); javaMailSender.send(simpleMailMessage); } }
測試類調用
@Autowired EmailUtil emailUtil; @Test public void sendMail(){ EmailBean emailBean = new EmailBean(); emailBean.setReceiver("xxxx@qq.com"); emailBean.setSubject("springBoot發送純文本郵件測試"); emailBean.setContent("這是一段純文本格式的郵件"); emailUtil.sendPlainTextMail(emailBean); }
測試執行,最終執行結果
發送郵件給多人,當然這個可以用的地方不是很多,在實體類我們將接收者receiver設成數組格式,方便群發郵件
替換上一步emailBean.setReceiver()
@Test public void sendMail(){ EmailBean emailBean = new EmailBean(); String[] arrReceivers = new String[] {"xxxxx1@qq.com", "xxxxx2@qq.com"}; emailBean.setReceiver(arrReceivers); emailBean.setSubject("springBoot發送純文本郵件測試"); emailBean.setContent("這是一段春純文本格式的郵件,當前時間" + new Date()); emailUtil.sendPlainTextMail(emailBean); logger.warn(String.format("發送郵件給%s成功", Arrays.toString(arrReceivers))); }
結果
(2)發送帶有HTML代碼的郵件發送
可以看到我們使用的JavaMailSender繼承了MailSender,發送純文本格式的使用SimpleMailMessage
而發送帶有附件信息或者富文本格式的郵件我們需要使用MimeMessage
在上一步EmailUtils.java里添加方法
public void sendMimeMail(EmailBean emailBean) throws MessagingException { MimeMessage mimeMessage = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true); mimeMessageHelper.setFrom(sender); mimeMessageHelper.setTo(emailBean.getReceiver()); mimeMessageHelper.setSubject(emailBean.getSubject()); mimeMessageHelper.setText(emailBean.getContent(), true); javaMailSender.send(mimeMessage); }
進行測試
@Test
public void sendMimeEmail() throws MessagingException {
EmailBean emailBean = new EmailBean();
emailBean.setReceiver("xxxxxx@qq.com");
emailBean.setSubject("springBoot發送HTML格式郵件測試");
emailBean.setContent("<h1 style='color:red'>springBoot集成郵件發送html格式郵件測試</h1>");
emailUtil.sendMimeMail(emailBean);
logger.warn("發送郵件給成功");
}
(3)html中含有圖片或者將圖片以正文發送郵件
html代碼中的圖片需要在MimeMessageHelper中添加
public void sendMimeMail(EmailBean emailBean) throws MessagingException { MimeMessage mimeMessage = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true); mimeMessageHelper.setFrom(sender); mimeMessageHelper.setTo(emailBean.getReceiver()); mimeMessageHelper.setSubject(emailBean.getSubject()); mimeMessageHelper.setText(emailBean.getContent(), true); FileSystemResource fileSystemResource = new FileSystemResource(new File("C:\\Users\\ThinkPad\\Desktop\\image.png")); mimeMessageHelper.addInline("image", fileSystemResource); javaMailSender.send(mimeMessage); }
這里mimeMessageHelper.addInline()中的參數表示獲取資源的id和Resource
@Test public void sendMimeEmail() throws MessagingException { EmailBean emailBean = new EmailBean(); emailBean.setReceiver("xxxxxx@qq.com"); emailBean.setSubject("springBoot發送HTML包含圖片郵件測試"); emailBean.setContent("<h5 style='color:red'>springBoot集成郵件發送html格式郵件測試</h5>" + "<img src='cid:image"); emailUtil.sendMimeMail(emailBean); logger.warn("發送郵件給成功"); }
點擊測試
可以看到圖片正常顯示
(4)帶有附件的郵件發送
在EmailUtil.java中添加方法
public void sendAppendMimeMail(EmailBean emailBean) throws MessagingException { MimeMessage mimeMessage = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true); mimeMessageHelper.setFrom(sender); mimeMessageHelper.setTo(emailBean.getReceiver()); mimeMessageHelper.setSubject(emailBean.getSubject()); mimeMessageHelper.setText(emailBean.getContent(), true); String filePath = "C:\\Users\\ThinkPad\\Desktop\\賬號密碼.xls"; FileSystemResource fileSystemResource = new FileSystemResource(new File(filePath)); mimeMessageHelper.addAttachment("11.xls", fileSystemResource); javaMailSender.send(mimeMessage); }
@Test public void sendAppendMimeEmail() throws MessagingException { EmailBean emailBean = new EmailBean(); emailBean.setReceiver("xxxxxx@qq.com"); emailBean.setSubject("springBoot集成郵件發送附件測試"); emailBean.setContent("<h1 style='color:red'>springBoot集成郵件發送html格式郵件及附件文件測試</h1>"); emailUtil.sendAppendMimeMail(emailBean);
logger.warn("含有附件郵件發送成功");
}
(5)使用Thymeleaf模板發送郵件
上一步我們用html代碼發送郵件,就寫了兩行已經感覺比較麻煩了字符串的拼接和圖片的上傳,較復雜的內容郵件用這種方式會顯得很麻煩,所有我們使用模板,需要改變的值用參數代替來達到個性化的郵件。
繼續在pom.xml文件中導入Thymeleaf依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
z在templates文件夾下新建mailTemp.html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body > <div style="background-color:#222222;"> <img src="http://message-center-cbc-cn.obs.cn-north-1.myhuaweicloud.com/BSS/templateImg/2019411_zh_logo.png" /> </div> <h4 th:text="|尊敬的華為雲客戶${username}|"></h4> 您好! <p style="text-indent:2em">您的賬戶余額不足50.00元,為了保證您的業務正常運行,請及時進行<a href="https://cnblogs.com/LiuFqiang">充值</a></p> <p style="text-indent:2em">感謝您對華為雲的支持!</p> <hr style="margin-left: initial;width: 100%; border:1px dashed #987cb9 "> <p style="color: #999;font-size: 14px;margin-top:10px;margin-bottom:40px"> 本郵件由系統自動發送,請勿直接回復! </p> <br > <p>官方網站:<a href="https://cnblogs.com/LiuFqiang">https://cnblogs.com/LiuFqiang</a></p> <p>Wechat:15641483049</p> </body> </html>
在測試類測試:
@Autowired private TemplateEngine templateEngine; @Test public void sendHtmlEmail() throws MessagingException { Context context = new Context(); context.setVariable("username", "劉**"); String emailContent = templateEngine.process("mailTemp", context); EmailBean emailBean = new EmailBean(); emailBean.setReceiver("xxxxx@qq.com"); emailBean.setSubject("springBoot集成郵件服務"); emailBean.setContent(emailContent); emailUtil.sendMimeMail(emailBean); logger.warn("模板郵件發送成功!"); }
這里需要注意templateEmgine.process的模板路徑名字一個要與template靜態文件的相對應,並且模板的參數名與context.setVariable的一一對應
完結!!!