欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 前端技术 > javascript >内容正文

javascript

Spring Boot——基于spring-boot-starter-mail发送邮件的 Service 服务类DEMO

发布时间:2024/10/5 javascript 48 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Spring Boot——基于spring-boot-starter-mail发送邮件的 Service 服务类DEMO 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

前言

发送邮件应该是网站的必备拓展功能之一,注册验证,忘记密码或者是给用户发送营销信息。正常我们会用JavaMail相关api来写发送邮件的相关代码,但现在Spring Boot提供了一套集成spring-boot-starter-mail的更简易使用的封装。

基本概念

spring-boot-starter-mail

Spring框架提供了一个有用的实用程序库,用于发送电子邮件,使您免受底层邮件系统的限制,并负责代表客户端进行低级资源处理。

该org.springframework.mail软件包是Spring框架的电子邮件支持的根级软件包。用于发送电子邮件的中央界面是该MailSender 界面。封装了简单邮件(例如from和to,以及许多其他邮件)的属性的简单值对象是SimpleMailMessage类。此程序包还包含一个已检查异常的层次结构,该层次结构提供了比较低级别的邮件系统异常更高的抽象级别,根异常为 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对Sun公司的邮件api功能进行了相应的封装。 

:Sun公司的邮件API不在Java SE JDK中,需要下载Java EE JDK & Java EE SDK

(实际上Java EE是在Java SE基础上发展构建的,是一系列技术规范,官方提供的Java EE SDK是Java EE的参考实现,是实现Java EE最全的开发工具包,而我们常说的JDK只是包含Java SE API实现,Java SE中存在与Java EE有关的规范;Java EE 7主要包括下面一些技术规范: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 # 设置邮箱主机 spring.mail.host=smtp.qq.com spring.mail.port=587 # 设置用户名 spring.mail.username=xxxxxxxx@qq.com # 设置密码,该处的密码是QQ邮箱开启SMTP的授权码而非QQ密码 spring.mail.password=xxxxxxxxxxxx spring.mail.protocol=smtp spring.mail.default-encoding=UTF-8 # 设置是否需要认证,如果为true,那么用户名和密码就必须的, # 如果设置false,可以不设置用户名和密码,当然也得看你的对接的平台是否支持无密码进行访问的。 spring.mail.properties.mail.smtp.auth=true # STARTTLS[1] 是对纯文本通信协议的扩展。它提供一种方式将纯文本连接升级为加密连接(TLS或SSL),而不是另外使用一个端口作加密通信。 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: false

Email配置类

用于解析Spring Boot配置文件中mail有关的自定义配置属性 

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 {/*** 发件邮箱*/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 {/*** 发送简单邮件* @param to 收件人地址* @param subject 邮件标题* @param content 邮件内容*/public void sendSimpleMail(String to, String subject, String content);/*** 发送简单邮件* @param to 收件人地址* @param subject 邮件标题* @param content 邮件内容* @param attachments<文件名,附件> 附件列表*/public void sendAttachmentsMail(String to, String subject, String content, List<Pair<String, File>> attachments);/*** 发送模板邮件* @param to 收件人地址* @param subject 邮件标题* @param content<key, 内容> 邮件内容* @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;/*** 用来发送模版邮件*/@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","测试","测试内容");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","测试","测试内容",atta);Map<String,Object> content = new HashMap<>();content.put("code","abc");emailService.sendTemplateMail("1600337300@qq.com","测试",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;}/*** 发送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邮件发送成功");}/*** 发送MimeMailMessage邮件* @param message 邮件*/@Overridepublic void sendMail(MimeMailMessage message) {message.setFrom(mailProperties.getUsername());message.setSentDate(new Date());javaMailSender.send(message.getMimeMessage());logger.debug("MimeMailMessage邮件发送成功");}/*** 发送简单邮件* @param to 接收者* @param subject 主题* @param content 内容*/@Overridepublic void sendSimpleMail(String to, String subject, String content) {SimpleMailMessage message = new SimpleMailMessage();message.setTo(to);message.setSubject(subject);message.setText(content);sendMail(message);}/*** 发送模板简单邮件* @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);}/*** 发送附件邮件* @param to 接收者* @param subject 主题* @param content 内容* @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);}/*** 发送模板附件邮件* @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 渲染结果*/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 认证失败

邮件发送中出现553问题

Velocity找不到模板文件

163邮箱作为测试服务器,遇到了邮件被认为是垃圾邮件的问题

参考文章

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位技术专家面对面20年技术见证,附赠技术全景图

总结

以上是生活随笔为你收集整理的Spring Boot——基于spring-boot-starter-mail发送邮件的 Service 服务类DEMO的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。