flask-mail异步发送邮件_spring Boot手把手教学(6):发送邮件
- 1、前言
- 2、安裝依賴
- 3、添加配置信息
- 4、代碼實(shí)現(xiàn)
- 5、功能擴(kuò)展
- 5.1、發(fā)送HTML格式郵件
- 5.2、發(fā)送帶附件的郵件
- 5.3、使用`thymeleaf`模板發(fā)送郵件
- 6、完整代碼
1、前言
發(fā)送郵件應(yīng)該是常用功能之一,無(wú)論是注冊(cè)激活用戶、賬戶會(huì)員到期提醒,還是業(yè)務(wù)營(yíng)銷(xiāo)信息提示,系統(tǒng)都需要自動(dòng)向用戶發(fā)郵件;
那么Spring Boot怎么發(fā)郵件呢?
Spring 推出了 JavaMailSender 簡(jiǎn)化了郵件發(fā)送的過(guò)程,現(xiàn)在 Spring Boot又對(duì)此進(jìn)行了封裝。
那就是 spring-boot-starter-mail 這個(gè)依賴包。
2、安裝依賴
<!-- 郵件 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency>3、添加配置信息
? src/main/resources/application.yml?server:port: 9002spring:mail:host: smtp.qq.comusername: 149807666@qq.compassword: sputxytreefvxrgoihefresources:static-locations: classpath:/resources/, classpath:/static/ ,classpath:/templates/mail:fromMail:addr: alex@qq.com # 發(fā)郵件者# 日志級(jí)別 logging:level:root: warncom.scaffold.test.mapper: tracecom.scaffold.test.task: trace
我們這里以QQ郵箱為例,smtp.qq.com 是郵箱服務(wù)器地址;
username 就是你的郵箱地址,password 就是你的郵箱密碼;
mai.fromMail.addr 就是發(fā)郵件人的郵箱地址。
4、代碼實(shí)現(xiàn)
? Entity---郵件信息實(shí)體類(lèi):com.scaffold.test.entity.Mail?package com.scaffold.test.entity;import lombok.Data;@Data public class Mail {// 發(fā)送給誰(shuí)private String to;// 發(fā)送主題private String subject;// 發(fā)送內(nèi)容private String content;// 附件地址private String filePath; }? Service---郵件服務(wù)接口:com.scaffold.test.service.MailService
?package com.scaffold.test.service;import com.scaffold.test.entity.Mail;public interface MailService {// 發(fā)送郵件public void sendMail(Mail mail); }? ServiceImpl---郵件服務(wù)接口實(shí)現(xiàn)類(lèi):com.scaffold.test.service.impl.MailServiceImpl
?package com.scaffold.test.service.impl;import com.scaffold.test.entity.Mail; import com.scaffold.test.service.MailService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.FileSystemResource; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service;import javax.mail.internet.MimeMessage; import java.io.File;@Service public class MailServiceImpl implements MailService {Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate JavaMailSender mailSender;@Value("${mail.fromMail.addr}")private String mailFrom;// 只發(fā)送文本@Overridepublic void sendMail(Mail mail) {SimpleMailMessage message = new SimpleMailMessage();message.setFrom(mailFrom);message.setTo(mail.getTo());message.setSubject(mail.getSubject());message.setText(mail.getContent());mailSender.send(message);logger.info("發(fā)送完畢");}} ? Controller---發(fā)郵件控制器:com.scaffold.test.controller.MailController
?package com.scaffold.test.controller;import com.scaffold.test.base.Result; import com.scaffold.test.base.ResultGenerator; import com.scaffold.test.entity.Mail; import com.scaffold.test.service.MailService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context;import javax.mail.MessagingException;@RestController @RequestMapping("/mail") public class MailController {@Autowiredprivate MailService mailService;// 發(fā)送不帶格式的文本@Async@GetMapping("post")public Result postMail() {Mail mail = new Mail();mail.setTo("******@qq.com");mail.setSubject("automatic");mail.setContent("自動(dòng)郵件發(fā)布");mailService.sendMail(mail);return ResultGenerator.getSuccessResult().setMessage("發(fā)送成功");} }
需要注意的一點(diǎn)就是:我們這里的代碼都是用了@Async注解,代表這是異步操作,所以返回的Result也會(huì)無(wú)效了,無(wú)效代碼我就不再注釋了,原來(lái)寫(xiě)的時(shí)候?qū)懙氖峭綀?zhí)行。
其實(shí)這里,用異步是對(duì)的,業(yè)務(wù)代碼中,郵件發(fā)送不是業(yè)務(wù)關(guān)注的重點(diǎn),可以延遲或者失敗,所以沒(méi)必要占用主進(jìn)程;
結(jié)果如圖:
到此為止,簡(jiǎn)單的發(fā)送郵件功能完成了,如果要自動(dòng)發(fā)布,就要加入定時(shí)任務(wù)了,可以參考上一篇文章:
spring Boot手把手教學(xué)(5): 定時(shí)任務(wù)
這里就不再贅述;
5、功能擴(kuò)展
5.1、發(fā)送HTML格式郵件
發(fā)送純文本,有時(shí)候不是那么滿足我們的業(yè)務(wù)要求,我們需要發(fā)送帶HTML格式的郵件如下:
? 在 MailService 中添加 sendHtmlMail 方法:com.scaffold.test.service.MailService?package com.scaffold.test.service;import com.scaffold.test.entity.Mail;import javax.mail.MessagingException;public interface MailService {// 發(fā)送郵件public void sendMail(Mail mail);// 發(fā)送Html郵件public void sendHtmlMail(Mail mail) throws MessagingException;} ? 對(duì)應(yīng)實(shí)現(xiàn)方法:com.scaffold.test.service.impl.MailServiceImpl
?// 發(fā)送Html郵件@Overridepublic void sendHtmlMail(Mail mail) {MimeMessage message = mailSender.createMimeMessage();try {MimeMessageHelper helper = new MimeMessageHelper(message, true);message.setFrom(mailFrom);helper.setTo(mail.getTo());helper.setSubject(mail.getSubject());helper.setText(mail.getContent(), true);mailSender.send(message);logger.info("發(fā)送Html郵件成功");} catch (Exception e) {e.printStackTrace();logger.error("發(fā)送Html郵件失敗");}} ? 控制器調(diào)用:com.scaffold.test.controller.MailController
?// 發(fā)送Html郵件@Async@GetMapping("postHtml")public Result postHtmlMail() throws MessagingException {String content = "<html>n" +"<body>n" +"<h3>hello! test Html test!</h3>n" +"</body>n" +"</html>";Mail mail = new Mail();mail.setTo("******@qq.com");mail.setSubject("Html格式郵件");mail.setContent(content);mailService.sendHtmlMail(mail);return ResultGenerator.getSuccessResult().setMessage("發(fā)送成功");}
結(jié)果如圖:
5.2、發(fā)送帶附件的郵件
有時(shí)候我們需要發(fā)送帶附件的郵件;
? 在 MailService 中添加 sendAttachmentsMail 方法:com.scaffold.test.service.MailService?package com.scaffold.test.service;import com.scaffold.test.entity.Mail;import javax.mail.MessagingException;public interface MailService {// 發(fā)送郵件public void sendMail(Mail mail);// 發(fā)送Html郵件public void sendHtmlMail(Mail mail) throws MessagingException;// 發(fā)送帶附件的郵件public void sendAttachmentsMail(Mail mail) throws MessagingException; }? 對(duì)應(yīng)實(shí)現(xiàn)類(lèi)方法:com.scaffold.test.service.impl.MailServiceImpl
?// 發(fā)送帶附件的郵件@Overridepublic void sendAttachmentsMail(Mail mail) {MimeMessage message = mailSender.createMimeMessage();try {MimeMessageHelper helper = new MimeMessageHelper(message, true);message.setFrom(mailFrom);helper.setTo(mail.getTo());helper.setSubject(mail.getSubject());helper.setText(mail.getContent(), true);// 附件FileSystemResource resourse = new FileSystemResource(new File(mail.getFilePath()));// 添加附件helper.addAttachment("test.png", resourse);mailSender.send(message);logger.info("發(fā)送郵件成功");} catch (Exception e) {e.printStackTrace();logger.error("發(fā)送郵件失敗");}} ? 控制器調(diào)用:com.scaffold.test.controller.MailController
?// 發(fā)送帶附件的郵件@Async@GetMapping("postAttachment")public Result postAttachmentsMail() throws MessagingException {Mail mail = new Mail();mail.setTo("***@qq.com");mail.setSubject("附件");mail.setContent("有附件,趕緊看下");mail.setFilePath("E:test.png");mailService.sendAttachmentsMail(mail);return ResultGenerator.getSuccessResult().setMessage("發(fā)送成功");}
效果如圖:
5.3、使用thymeleaf模板發(fā)送郵件
另外,為了格式的優(yōu)美,有時(shí)候我們需要使用模板發(fā)送郵件;
這里我們使用thymeleaf :
? 安裝依賴?<!-- thymeleaf 模板 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency><dependency><groupId>ognl</groupId><artifactId>ognl</artifactId><version>3.2.14</version> </dpendency> ? 控制器調(diào)用:com.scaffold.test.controller.MailController
? @Autowiredprivate SpringTemplateEngine templateEngine;// 發(fā)送 Html 模板郵件@Async@GetMapping("postTemplate")public void postTemplateMail() throws MessagingException {Context context = new Context();Map<String, Object> emailParam = new HashMap<>();emailParam.put("name", "產(chǎn)品終端更換名字");emailParam.put("content", "牛牛終端");emailParam.put("person", "Alex Wong");context.setVariable("emailParam", emailParam);String emailTemplate = templateEngine.process("emailTemplate", context);Mail mail = new Mail();mail.setTo("*****@qq.com");mail.setSubject("模板郵件");mail.setContent(emailTemplate);mailService.sendHtmlMail(mail);} ? 模板文件:src/main/resources/templates/emailTemplate.html
?<!DOCTYPE html> <html lang="en"xmlns="http://www.w3.org/1999/xhtml"xmlns:th="http://www.thymeleaf.org"> <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>mail</title> </head> <body><table align="center" cellpadding="0" cellspacing="0" width="600px"><tr><td><table align="center" border="0" cellpadding="0" cellspacing="0" width="600"style="border-collapse: collapse;"><tr><td align="center" style="padding: 40px 0 30px 0;"><img src='你的圖片地址' style='width:183px height:47.50px'></td></tr><tr><td bgcolor="#ffffff" style="padding: 0px 30px 20px 30px"><h3>產(chǎn)品名稱(chēng)變更通知</h3><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td colspan="2" style="padding: 0 0 3px 0">通知事項(xiàng):<span th:text="${emailParam.name}"></span></td></tr><tr><td style="padding: 12px 0 3px 0">產(chǎn)品名稱(chēng):<span th:text="${emailParam.content}"></span></td></tr><tr><td style="padding: 12px 0 3px">審批人:<span th:text="${emailParam.person}"></span></td></tr></table></td></tr></table></td></tr></table> </body> </html>
效果如圖:
6、完整代碼
? Entity---郵件信息實(shí)體類(lèi):com.scaffold.test.entity.Mail?package com.scaffold.test.entity;import lombok.Data;@Data public class Mail {// 發(fā)送給誰(shuí)private String to;// 發(fā)送主題private String subject;// 發(fā)送內(nèi)容private String content;// 附件地址private String filePath; }? Service---郵件服務(wù)接口:com.scaffold.test.service.MailService
?package com.scaffold.test.service;import com.scaffold.test.entity.Mail;import javax.mail.MessagingException;public interface MailService {// 發(fā)送郵件public void sendMail(Mail mail);// 發(fā)送Html郵件public void sendHtmlMail(Mail mail) throws MessagingException;// 發(fā)送帶附件的郵件public void sendAttachmentsMail(Mail mail) throws MessagingException; } ? ServiceImpl---郵件服務(wù)接口實(shí)現(xiàn)類(lèi):com.scaffold.test.service.impl.MailServiceImpl
?package com.scaffold.test.service.impl;import com.scaffold.test.entity.Mail; import com.scaffold.test.service.MailService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.FileSystemResource; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service;import javax.mail.internet.MimeMessage; import java.io.File;@Service public class MailServiceImpl implements MailService {Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate JavaMailSender mailSender;@Value("${mail.fromMail.addr}")private String mailFrom;// 只發(fā)送文本@Overridepublic void sendMail(Mail mail) {SimpleMailMessage message = new SimpleMailMessage();message.setFrom(mailFrom);message.setTo(mail.getTo());message.setSubject(mail.getSubject());message.setText(mail.getContent());mailSender.send(message);logger.info("發(fā)送完畢");}// 發(fā)送Html郵件@Overridepublic void sendHtmlMail(Mail mail) {MimeMessage message = mailSender.createMimeMessage();try {MimeMessageHelper helper = new MimeMessageHelper(message, true);message.setFrom(mailFrom);helper.setTo(mail.getTo());helper.setSubject(mail.getSubject());helper.setText(mail.getContent(), true);mailSender.send(message);logger.info("發(fā)送Html郵件成功");} catch (Exception e) {e.printStackTrace();logger.error("發(fā)送Html郵件失敗");}}// 發(fā)送帶附件的郵件@Overridepublic void sendAttachmentsMail(Mail mail) {MimeMessage message = mailSender.createMimeMessage();try {MimeMessageHelper helper = new MimeMessageHelper(message, true);message.setFrom(mailFrom);helper.setTo(mail.getTo());helper.setSubject(mail.getSubject());helper.setText(mail.getContent(), true);// 附件FileSystemResource resourse = new FileSystemResource(new File(mail.getFilePath()));// 添加附件helper.addAttachment("test.png", resourse);mailSender.send(message);logger.info("發(fā)送郵件成功");} catch (Exception e) {e.printStackTrace();logger.error("發(fā)送郵件失敗");}} } ? Controller---發(fā)郵件控制器:com.scaffold.test.controller.MailController
?package com.scaffold.test.controller;import com.scaffold.test.entity.Mail; import com.scaffold.test.service.MailService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.thymeleaf.context.Context; import org.thymeleaf.spring5.SpringTemplateEngine;import javax.mail.MessagingException; import java.util.HashMap; import java.util.Map;@RestController @RequestMapping("/mail") public class MailController {@Autowiredprivate MailService mailService;@Autowiredprivate SpringTemplateEngine templateEngine;// 發(fā)送不帶格式的文本@Async@GetMapping("post")public void postMail() {Mail mail = new Mail();mail.setTo("**@qq.com");mail.setSubject("automatic");mail.setContent("自動(dòng)郵件發(fā)布");mailService.sendMail(mail); // return ResultGenerator.getSuccessResult().setMessage("發(fā)送成功");}// 發(fā)送Html郵件@Async@GetMapping("postHtml")public void postHtmlMail() throws MessagingException {String content = "<html>n" +"<body>n" +"<h3>hello! test Html test!</h3>n" +"</body>n" +"</html>";Mail mail = new Mail();mail.setTo("***@qq.com");mail.setSubject("Html格式郵件");mail.setContent(content);mailService.sendHtmlMail(mail); // return ResultGenerator.getSuccessResult().setMessage("發(fā)送成功");}// 發(fā)送帶附件的郵件@Async@GetMapping("postAttachment")public void postAttachmentsMail() throws MessagingException {Mail mail = new Mail();mail.setTo("****@qq.com");mail.setSubject("附件");mail.setContent("有附件,趕緊看下");mail.setFilePath("E:test.png");mailService.sendAttachmentsMail(mail); // return ResultGenerator.getSuccessResult().setMessage("發(fā)送成功");}// 發(fā)送 Html 模板郵件@Async@GetMapping("postTemplate")public void postTemplateMail() throws MessagingException {Context context = new Context();Map<String, Object> emailParam = new HashMap<>();emailParam.put("name", "產(chǎn)品終端更換名字");emailParam.put("content", "牛牛終端");emailParam.put("person", "Alex Wong");context.setVariable("emailParam", emailParam);String emailTemplate = templateEngine.process("emailTemplate", context);Mail mail = new Mail();mail.setTo("***@qq.com");mail.setSubject("模板郵件");mail.setContent(emailTemplate);mailService.sendHtmlMail(mail); // return ResultGenerator.getSuccessResult().setMessage("發(fā)送成功");}}
總結(jié)
以上是生活随笔為你收集整理的flask-mail异步发送邮件_spring Boot手把手教学(6):发送邮件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mybatis plugins_[MyB
- 下一篇: python series转int_分享