Spring?Boot集成JavaMailSender發(fā)送郵件功能的實(shí)現(xiàn)
前言
項(xiàng)目中郵件發(fā)送為常用功能之一,例如注冊(cè)成功后需要發(fā)送激活郵件,賬號(hào)的會(huì)員到期提示,每日?qǐng)?bào)表統(tǒng)計(jì)等功能都需要自動(dòng)發(fā)送郵件,本文將講解Spring Boot如何實(shí)現(xiàn)郵件發(fā)送功能。
集成步驟
添加依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
郵件配置信息
在resource目錄下新增mail.properties內(nèi)容如下:
#企業(yè)郵件配置 mail.host=smtp.exmail.qq.com #端口 mail.port=587 mail.userName=xxx.com mail.password=yyy mail.smtp.timeou=15000 mail.smtp.auth=false mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
加載屬性文件
@Component @ConfigurationProperties(prefix = "mail") @PropertySource(value = { "classpath:mail.properties" }) public class MailSenderConfig implements Serializable { private static final long serialVersionUID = -4558468113448742143L; /** * 主機(jī) */ private String host; /** * 端口 */ private int port; /** * 用戶名 */ private String userName; /*** * 密碼 */ private String password; //省略get、set方法 }
通過@PropertySource注解加載外部屬性文件,不熟悉的朋友可以查看這篇文章。
郵件配置類
@Configuration public class MailConfig { @Autowired private MailSenderConfig mailSenderConfig; @Bean public JavaMailSenderImpl createMailSender() { JavaMailSenderImpl javaMailSender =new JavaMailSenderImpl(); javaMailSender.setDefaultEncoding("UTF-8"); javaMailSender.setHost(mailSenderConfig.getHost()); javaMailSender.setPort(mailSenderConfig.getPort()); javaMailSender.setProtocol(JavaMailSenderImpl.DEFAULT_PROTOCOL); javaMailSender.setUsername(mailSenderConfig.getUserName()); javaMailSender.setPassword(mailSenderConfig.getPassword()); Properties p = new Properties(); p.setProperty("mail.smtp.timeout", "25000"); p.setProperty("mail.smtp.auth", "true"); p.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); javaMailSender.setJavaMailProperties(p); return javaMailSender; } }
注意:JavaMailSenderImpl是JavaMailSender的實(shí)現(xiàn)。
代碼實(shí)現(xiàn)
發(fā)送簡(jiǎn)單郵件
郵件實(shí)體類
public class Mail implements Serializable { private static final long serialVersionUID = -1001194001681838276L; /** * 發(fā)送者 */ private String from; /** * 接收者 */ private String to; private String cc; private String bcc; /** * 主題 */ private String subject; /** * 內(nèi)容 */ private String body; private String fileName; /** * 文件路徑 */ private String filePath; // }
業(yè)務(wù)實(shí)現(xiàn)類
public interface MailService { /** * 發(fā)送簡(jiǎn)單郵件 * @param mail */ void sendSimpleMail(Mail mail); } // 實(shí)現(xiàn)類 @Component public class MailServiceImpl implements MailService { private Logger logger = LoggerFactory.getLogger(MailServiceImpl.class); @Autowired private JavaMailSenderImpl mailSender; @Autowired private SpringTemplateEngine templateEngine; public void sendSimpleMail(Mail mail) { SimpleMailMessage message = new SimpleMailMessage(); message.setFrom(mail.getFrom()); message.setTo(mail.getTo()); message.setSubject(mail.getSubject()); message.setText(mail.getBody()); mailSender.send(message); logger.info("發(fā)送完畢"); } }
測(cè)試類
@RestController @RequestMapping("mail") public class MailController { @Autowired private MailService mailService; @Async @GetMapping("sendSimplEmail") public String sendSimplEmail() { Mail mail = new Mail(); mail.setFrom("xx@qq.com); mail.setTo("yyy@qq.com"); mail.setSubject("測(cè)試郵件"); mail.setBody("這是一封測(cè)試郵件"); mailService.sendSimpleMail(mail); return "發(fā)送成功"; }
注意:郵件功能需要異步發(fā)送,所以采用的@Async注解來實(shí)現(xiàn)。
至此簡(jiǎn)單的郵件發(fā)送功能已經(jīng)完成。
擴(kuò)展功能
發(fā)送Html內(nèi)容的郵件
發(fā)送簡(jiǎn)單的郵件,有時(shí)候無法滿足業(yè)務(wù)的需求,我們需要至此發(fā)送帶HTMl內(nèi)容格式的郵件。
業(yè)務(wù)實(shí)現(xiàn)類
public void sendHtmlMail(Mail mail) { MimeMessage message =mailSender.createMimeMessage(); MimeMessageHelper messageHelper=null; try { // 設(shè)置編碼utf-8 messageHelper = new MimeMessageHelper(message, true, "UTF-8"); messageHelper.setFrom(mail.getFrom()); messageHelper.setTo(mail.getTo()); messageHelper.setSubject(mail.getSubject()); //轉(zhuǎn)換html messageHelper.setText(mail.getBody(),true); mailSender.send(message); } catch (MessagingException e) { logger.error("發(fā)送郵件失敗"); throw new RuntimeException("發(fā)送郵件失敗",e); } logger.info("發(fā)送完畢"); }
注意事項(xiàng): 1.采用html格式的郵件需要注意內(nèi)容的格式,采用UTF-8格式否則中文會(huì)出現(xiàn)亂碼。 2.設(shè)置郵件內(nèi)容時(shí),需要將設(shè)置為true,否則html內(nèi)容會(huì)原本輸出。
測(cè)試類
@Async @GetMapping("sendHtmlEmail") public String sendHtmlEmail() { Mail mail = new Mail(); mail.setFrom("xx@qq.com); mail.setTo("yyy@qq.com"); mail.setSubject("測(cè)試html格式郵件"); String content = "<html>\n" + "<body>\n" + "<h3>hello! 這是測(cè)試html內(nèi)容郵件!</h3>\n" + "</body>\n" + "</html>"; mail.setBody(content); mailService.sendHtmlMail(mail); return "發(fā)送成功"; }
發(fā)送帶附件郵件
業(yè)務(wù)實(shí)現(xiàn)類
public void sendAttachmentsMail(Mail mail) { MimeMessage message =mailSender.createMimeMessage(); MimeMessageHelper messageHelper=null; try { // 設(shè)置編碼utf-8 messageHelper = new MimeMessageHelper(message, true, "UTF-8"); messageHelper.setFrom(mail.getFrom()); messageHelper.setTo(mail.getTo()); messageHelper.setSubject(mail.getSubject()); //轉(zhuǎn)換html messageHelper.setText(mail.getBody(),true); // 附件 FileSystemResource resourse = new FileSystemResource(new File(mail.getFilePath())); // 附件名稱和路徑 messageHelper.addAttachment(mail.getFileName(), resourse); mailSender.send(message); } catch (MessagingException e) { logger.error("發(fā)送郵件失敗"); throw new RuntimeException("發(fā)送郵件失敗",e); } logger.info("發(fā)送完畢"); }
測(cè)試類
@Async @GetMapping("sendAttachmentsMail") public String sendAttachmentsMail() { Mail mail = new Mail(); mail.setFrom("xx@qq.com); mail.setTo("yyy@qq.com"); mail.setSubject("測(cè)試附件郵件"); mail.setBody("測(cè)試附件郵件,有附件請(qǐng)下載"); mail.setFilePath("E:\\cfg\\test.png"); mail.setFileName("test.png"); mailService.sendAttachmentsMail(mail); return "發(fā)送成功"; }
注意:設(shè)置附件的路徑和附件的名稱。
發(fā)送模板郵件
有些特殊需要,我們需要采用固定的郵件模板發(fā)送郵件。
郵件的模板可以采用thymeleaf和freemark來實(shí)現(xiàn),本文將采用thymeleaf來實(shí)現(xiàn)郵件模板發(fā)送。
添加依賴
<!-- 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> </dependency>
模板內(nèi)容
模板路徑:src/main/resources/templates/emailTemplate.html
模板內(nèi)容:
<!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" style="margin-bottom:20px"> <tr> <td> <table align="center" border="0" cellpadding="0" cellspacing="0" width="600" style="border-collapse: collapse;"> <tr> <td bgcolor="#ffffff"> <h3>郵件模板</h3> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tr> <td colspan="2" style="padding: 0 0 3px 0"> 公司名稱:<span th:text="${emailParam.companyName}"></span> </td> </tr> <tr> <td style="padding: 12px 0 3px 0"> 地址:<span th:text="${emailParam.address}"></span> </td> </tr> <tr> <td style="padding: 12px 0 3px"> 聯(lián)系人:<span th:text="${emailParam.phone}"></span> </td> </tr> </table> </td> </tr> </table> </td> </tr> </table> </body> </html>
業(yè)務(wù)實(shí)現(xiàn)類
public void sendTemplateMail(Mail mail) { Context context = new Context(); Map<String, Object> emailParam = new HashMap<>(); emailParam.put("companyName", "公司名稱"); emailParam.put("address", "公司地址"); emailParam.put("phone", "聯(lián)系電話"); context.setVariable("emailParam", emailParam); //模板合成html內(nèi)容 String emailTemplate = templateEngine.process("emailTemplate", context); mail.setBody(emailTemplate); sendHtmlMail(mail); }
測(cè)試示例
@Async @GetMapping("sendTemplateEmail") public String sendTemplateEmail() { Mail mail = new Mail(); mail.setFrom("xx@qq.com); mail.setTo("yyy@qq.com"); mail.setSubject("測(cè)試模板郵件"); mailService.sendTemplateMail(mail); return "發(fā)送成功"; }
總結(jié)
本文講解的是Spring Boot集成JavaMailSender發(fā)送郵件,郵件內(nèi)容格式有種,需要結(jié)合業(yè)務(wù)的來選擇對(duì)應(yīng)的實(shí)現(xiàn)方式。
到此這篇關(guān)于Spring Boot集成JavaMailSender發(fā)送郵件功能的文章就介紹到這了,更多相關(guān)SpringBoot JavaMailSender發(fā)郵件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Mybatis-Plus的CRUD的實(shí)現(xiàn)
這篇文章主要介紹了基于Mybatis-Plus的CRUD的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11java中對(duì)象和Map互相轉(zhuǎn)換的幾種常見方式舉例
Map在日常開發(fā)應(yīng)用中的頻率很高,最常用的實(shí)現(xiàn)類是HashMap和有序的TreeMap,下面這篇文章主要給大家介紹了關(guān)于java中對(duì)象和Map互相轉(zhuǎn)換的幾種常見方式舉例,需要的朋友可以參考下2024-01-01java基礎(chǔ)之標(biāo)簽、按鈕和按鈕事件簡(jiǎn)介
本文給大家?guī)淼氖莏ava圖形界面的基礎(chǔ)知識(shí),簡(jiǎn)單介紹了標(biāo)簽、按鈕和按鈕事件,十分的詳細(xì),有需要的小伙伴可以參考下。2015-06-06mybatis plus or and 的合并寫法實(shí)例
這篇文章主要介紹了mybatis plus or and 的合并寫法實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02SpringBoot 錯(cuò)誤處理機(jī)制與自定義錯(cuò)誤處理實(shí)現(xiàn)詳解
這篇文章主要介紹了SpringBoot 錯(cuò)誤處理機(jī)制與自定義錯(cuò)誤處理實(shí)現(xiàn)詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11