javascript
Spring Boot——基于spring-boot-starter-mail发送邮件的 Service 服务类DEMO
前言
發(fā)送郵件應(yīng)該是網(wǎng)站的必備拓展功能之一,注冊(cè)驗(yàn)證,忘記密碼或者是給用戶發(fā)送營(yíng)銷信息。正常我們會(huì)用JavaMail相關(guān)api來(lái)寫發(fā)送郵件的相關(guān)代碼,但現(xiàn)在Spring Boot提供了一套集成spring-boot-starter-mail的更簡(jiǎn)易使用的封裝。
基本概念
spring-boot-starter-mail:
Spring框架提供了一個(gè)有用的實(shí)用程序庫(kù),用于發(fā)送電子郵件,使您免受底層郵件系統(tǒng)的限制,并負(fù)責(zé)代表客戶端進(jìn)行低級(jí)資源處理。
該org.springframework.mail軟件包是Spring框架的電子郵件支持的根級(jí)軟件包。用于發(fā)送電子郵件的中央界面是該MailSender?界面。封裝了簡(jiǎn)單郵件(例如from和to,以及許多其他郵件)的屬性的簡(jiǎn)單值對(duì)象是SimpleMailMessage類。此程序包還包含一個(gè)已檢查異常的層次結(jié)構(gòu),該層次結(jié)構(gòu)提供了比較低級(jí)別的郵件系統(tǒng)異常更高的抽象級(jí)別,根異常為?MailException。
官方文檔
Spring Boot:https://docs.spring.io/spring-boot/docs/2.2.4.RELEASE/reference/htmlsingle/#boot-features-email?
Spring:https://docs.spring.io/spring/docs/5.2.3.RELEASE/spring-framework-reference/integration.html#mail
Maven
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>?依賴樹:
spring-boot-starter-mail-xxx.jar對(duì)Sun公司的郵件api功能進(jìn)行了相應(yīng)的封裝。?
注:Sun公司的郵件API不在Java SE JDK中,需要下載Java EE JDK & Java EE SDK
(實(shí)際上Java EE是在Java SE基礎(chǔ)上發(fā)展構(gòu)建的,是一系列技術(shù)規(guī)范,官方提供的Java EE SDK是Java EE的參考實(shí)現(xiàn),是實(shí)現(xiàn)Java EE最全的開發(fā)工具包,而我們常說(shuō)的JDK只是包含Java SE API實(shí)現(xiàn),Java SE中存在與Java EE有關(guān)的規(guī)范;Java EE 7主要包括下面一些技術(shù)規(guī)范:http://www.oracle.com/technetwork/cn/java/javaee/tech/index.html)
Java EE JDK Specification:https://jcp.org/aboutJava/communityprocess/final/jsr366/index.html
Java EE SDK:https://www.oracle.com/java/technologies/java-ee-sdk-download.html
?
配置?
application.properties配置
#Email Config spring.mail.test-connection=true # 設(shè)置郵箱主機(jī) spring.mail.host=smtp.qq.com spring.mail.port=587 # 設(shè)置用戶名 spring.mail.username=xxxxxxxx@qq.com # 設(shè)置密碼,該處的密碼是QQ郵箱開啟SMTP的授權(quán)碼而非QQ密碼 spring.mail.password=xxxxxxxxxxxx spring.mail.protocol=smtp spring.mail.default-encoding=UTF-8 # 設(shè)置是否需要認(rèn)證,如果為true,那么用戶名和密碼就必須的, # 如果設(shè)置false,可以不設(shè)置用戶名和密碼,當(dāng)然也得看你的對(duì)接的平臺(tái)是否支持無(wú)密碼進(jìn)行訪問的。 spring.mail.properties.mail.smtp.auth=true # STARTTLS[1] 是對(duì)純文本通信協(xié)議的擴(kuò)展。它提供一種方式將純文本連接升級(jí)為加密連接(TLS或SSL),而不是另外使用一個(gè)端口作加密通信。 spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true spring.mail.properties.mail.smtp.socketFactory.port=465 spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory spring.mail.properties.mail.smtp.socketFactory.fallback=false?application.yml配置?
spring:mail:# 163host: smtp.163.comport:username: yimcarson@163.compassword: ************protocol: smtpdefault-encoding: UTF-8properties:mail.smtp.auth: truemail.smtp.starttls.enable: truemail.smtp.starttls.required: truemail.smtp.socketFactory.port: 465mail.smtp.socketFactory.class: javax.net.ssl.SSLSocketFactorymail.smtp.socketFactory.fallback: falseEmail配置類
用于解析Spring Boot配置文件中mail有關(guān)的自定義配置屬性?
import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component;@Component @ConfigurationProperties(prefix = "spring.mail") public class EmailConfig {/*** 發(fā)件郵箱*/private String emailFrom;public String getEmailFrom() {return emailFrom;}public void setEmailFrom(String emailFrom) {this.emailFrom = emailFrom;}}Service
方案一
EmailService?
package club.zstuca.myzstu.service;import javafx.util.Pair;import java.io.File; import java.util.List; import java.util.Map;/*** @Author ShenTuZhiGang* @Version 1.0.0* @Date 2020-02-15 21:29*/ public interface EmailService {/*** 發(fā)送簡(jiǎn)單郵件* @param to 收件人地址* @param subject 郵件標(biāo)題* @param content 郵件內(nèi)容*/public void sendSimpleMail(String to, String subject, String content);/*** 發(fā)送簡(jiǎn)單郵件* @param to 收件人地址* @param subject 郵件標(biāo)題* @param content 郵件內(nèi)容* @param attachments<文件名,附件> 附件列表*/public void sendAttachmentsMail(String to, String subject, String content, List<Pair<String, File>> attachments);/*** 發(fā)送模板郵件* @param to 收件人地址* @param subject 郵件標(biāo)題* @param content<key, 內(nèi)容> 郵件內(nèi)容* @param attachments<文件名,附件> 附件列表*/public void sendTemplateMail(String to, String subject, Map<String, Object> content, List<Pair<String, File>> attachments); }EmailServiceImpl?
package club.zstuca.myzstu.service.Impl;import club.zstuca.myzstu.config.EmailConfig; import club.zstuca.myzstu.service.EmailService; import javafx.util.Pair; import org.springframework.beans.factory.annotation.Autowired; 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 org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context;import javax.mail.internet.MimeMessage; import java.io.File; import java.util.List; import java.util.Map;/*** @Author ShenTuZhiGang* @Version 1.0.0* @Date 2020-02-15 21:31*/ @Service public class EmailServiceImpl implements EmailService {@Autowiredprivate EmailConfig emailConfig;@Autowiredprivate JavaMailSender mailSender;/*** 用來(lái)發(fā)送模版郵件*/@Autowiredprivate TemplateEngine templateEngine;@Overridepublic void sendSimpleMail(String to, String subject, String content) {SimpleMailMessage message = new SimpleMailMessage();message.setFrom(emailConfig.getEmailFrom());message.setTo(to);message.setSubject(subject);message.setText(content);mailSender.send(message);}@Overridepublic void sendAttachmentsMail(String to, String subject, String content, List<Pair<String, File>> attachments) {MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = null;try {helper = new MimeMessageHelper(message, true);helper.setFrom(emailConfig.getEmailFrom());helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);if(attachments != null){for(Pair<String,File> attachment:attachments){FileSystemResource file = new FileSystemResource(attachment.getValue());helper.addAttachment(attachment.getKey(), file);}}mailSender.send(message);} catch (Exception e) {e.printStackTrace();}}@Overridepublic void sendTemplateMail(String to, String subject, Map<String, Object> content, List<Pair<String, File>> attachments) {Context context = new Context();context.setVariables(content);String emailContent = templateEngine.process("mail", context);sendAttachmentsMail(to,subject,emailContent,attachments);} }?TEST
package club.zstuca.myzstu.email;import club.zstuca.myzstu.service.EmailService; import javafx.util.Pair; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest;import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;/*** @Author ShenTuZhiGang* @Version 1.0.0* @Date 2020-02-16 11:35*/ @SpringBootTest public class EmailTEST {@Autowiredprivate EmailService emailService;@Testpublic void email(){emailService.sendSimpleMail("1600337300@qq.com","測(cè)試","測(cè)試內(nèi)容");List<Pair<String, File>> atta= new ArrayList<>();String filename = "E:\\Code\\Project\\JAVA\\myzstu\\src\\main\\resources\\application.properties";File file = new File(filename);Pair<String, File> pair = new Pair<>("application.properties",file);atta.add(pair);emailService.sendAttachmentsMail("1600337300@qq.com","測(cè)試","測(cè)試內(nèi)容",atta);Map<String,Object> content = new HashMap<>();content.put("code","abc");emailService.sendTemplateMail("1600337300@qq.com","測(cè)試",content,atta);} }方案二
IMailService
/*** @author ShenTuZhiGang* @version 1.0.0* @date 2021-03-16 17:05*/ public interface IMailService {void sendMail(SimpleMailMessage message);void sendMail(MimeMailMessage message);void sendSimpleMail(String to, String subject, String content);void sendTemplateMail(String to, String subject, String template, Map<String, Object> variables);void sendAttachmentMail(String to, String subject, String content, Map<String, InputStream> attachments) throws MessagingException;void sendTemplateAttachmentMail(String to, String subject, String template, Map<String, Object> variables, Map<String, InputStream> attachments) throws MessagingException; }MailServiceImpl
/*** @author ShenTuZhiGang* @version 1.0.0* @date 2021-03-16 17:05*/ @Service public class MailServiceImpl implements IMailService {public static final Logger logger = LoggerFactory.getLogger(MailServiceImpl.class);private final JavaMailSender javaMailSender;private final MailProperties mailProperties;private final TemplateEngine templateEngine;public MailServiceImpl(JavaMailSender javaMailSender, MailProperties mailProperties, TemplateEngine templateEngine) {this.javaMailSender = javaMailSender;this.mailProperties = mailProperties;this.templateEngine = templateEngine;}/*** 發(fā)送SimpleMailMessage郵件* @param message 郵件*/@Overridepublic void sendMail(SimpleMailMessage message) {if(Objects.requireNonNull(message.getTo()).length == 0){return;}message.setFrom(mailProperties.getUsername());message.setSentDate(new Date());javaMailSender.send(message);logger.debug("SimpleMailMessage郵件發(fā)送成功");}/*** 發(fā)送MimeMailMessage郵件* @param message 郵件*/@Overridepublic void sendMail(MimeMailMessage message) {message.setFrom(mailProperties.getUsername());message.setSentDate(new Date());javaMailSender.send(message.getMimeMessage());logger.debug("MimeMailMessage郵件發(fā)送成功");}/*** 發(fā)送簡(jiǎn)單郵件* @param to 接收者* @param subject 主題* @param content 內(nèi)容*/@Overridepublic void sendSimpleMail(String to, String subject, String content) {SimpleMailMessage message = new SimpleMailMessage();message.setTo(to);message.setSubject(subject);message.setText(content);sendMail(message);}/*** 發(fā)送模板簡(jiǎn)單郵件* @param to 接收者* @param subject 主題* @param template 模板名稱* @param variables 變量*/@Overridepublic void sendTemplateMail(String to, String subject, String template,Map<String, Object> variables) {String content = renderTemplate(template,variables);sendSimpleMail(to,subject,content);}/*** 發(fā)送附件郵件* @param to 接收者* @param subject 主題* @param content 內(nèi)容* @param attachments 附件* @throws MessagingException*/@Overridepublic void sendAttachmentMail(String to, String subject, String content,Map<String, InputStream> attachments)throws MessagingException {MimeMailMessage message = new MimeMailMessage(javaMailSender.createMimeMessage());message.setTo(to);message.setSubject(subject);message.setText(content);if(attachments != null){Set<Map.Entry<String, InputStream>> entries = attachments.entrySet();MimeMessageHelper helper = message.getMimeMessageHelper();for(Map.Entry<String, InputStream> attachment:entries){InputStreamResource file = new InputStreamResource(attachment.getValue());helper.addAttachment(attachment.getKey(), file);}}sendMail(message);}/*** 發(fā)送模板附件郵件* @param to 接收者* @param subject 主題* @param template 模板名稱* @param variables 變量* @param attachments 附件* @throws MessagingException*/@Overridepublic void sendTemplateAttachmentMail(String to, String subject, String template,Map<String, Object> variables, Map<String, InputStream> attachments)throws MessagingException {String content = renderTemplate(template,variables);sendAttachmentMail(to,subject, content, attachments);}/*** 渲染模板* @param template 模板名稱* @param variables 變量* @return 渲染結(jié)果*/private String renderTemplate(String template, Map<String,Object> variables){Context context = new Context();context.setVariables(variables);logger.debug("渲染模板:" + template);return templateEngine.process(template, context);} }常見問題
Gmail郵箱:[Couldn't connect to host, port: smtp.gmail.com, 465; timeout -1]
535 認(rèn)證失敗
郵件發(fā)送中出現(xiàn)553問題
Velocity找不到模板文件
163郵箱作為測(cè)試服務(wù)器,遇到了郵件被認(rèn)為是垃圾郵件的問題
參考文章
https://blog.csdn.net/a286352250/article/details/53157963
https://blog.csdn.net/caychen/article/details/82887926
https://blog.csdn.net/yimcarson/article/details/84936440
https://blog.csdn.net/shangyuanlang/article/details/80883253
https://blog.csdn.net/lvyuan1234/article/details/80534072
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Spring Boot——基于spring-boot-starter-mail发送邮件的 Service 服务类DEMO的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Bootstrap——table标签使用
- 下一篇: JavaScript——仿键盘打字输入动