欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > SpringBoot整合邮件发送

SpringBoot整合邮件发送

2024/10/24 8:32:23 来源:https://blog.csdn.net/zhuge_long/article/details/140491550  浏览:    关键词:SpringBoot整合邮件发送

利用JavaMail完成发送激活邮件的功能。当前案例是以腾讯qq邮箱服务器为演示案例:

开启邮件服务授权

qq邮箱服务器官方会回送一个授权码在网页,类似下图的效果:

邮件发送流程

因为springboot提供了java操作邮件发送的启动器,所以在springboot 项目中完成邮件发送的功能,还是很简单、方便的。大致流程如下所示:

pom.xml 引入邮件发送启动器

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>

通过JavaMail的API完成邮件发送功能的代码封装,此处直接提供的工具类

  • 抽取接口
public interface MailService {void sendSimpleMail(String to, String subject, String content);void sendHtmlMail(String to, String subject, String content);void sendAttachmentsMail(String to, String subject,String content, String filePath);void sendInlineResourceMail(String to, String subject,String content, String rscPath, String rscId);
}
  • 实现类
@Slf4j
@Component
@Data
@ConfigurationProperties(prefix = "spring.mail")
public class MailUtil implements MailService{@Autowiredprivate JavaMailSender mailSender; //springboot提供的邮件发送的apiprivate String from;//获取发件人的邮箱地址@Overridepublic void sendSimpleMail(String to, String subject, String content) {log.info("from===="+from);SimpleMailMessage message = new SimpleMailMessage();message.setFrom(from); //发件人message.setTo(to); //收件人message.setSubject(subject); //邮件主题message.setText(content); //邮件内容,只能纯文本try {mailSender.send(message);log.info("简单邮件已经发送。");} catch (Exception e) {e.printStackTrace();log.error("发送简单邮件时发生生异常!", e);}}@Overridepublic void sendHtmlMail(String to, String subject, String content) {MimeMessage message = mailSender.createMimeMessage();try {// true 表示需要创建一一个 multipart messageMimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true); //邮件内容包含htmlmailSender.send(message);log.info("html邮件发送成功");} catch (Exception e) {log.error("发送html邮件时发生生异常!", e);}}@Overridepublic void sendAttachmentsMail (String to, String subject,String content, String filePath) {MimeMessage message = mailSender.createMimeMessage();try {MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);FileSystemResource file = new FileSystemResource(new File(filePath));String fileName = file.getFilename();helper.addAttachment(fileName, file); //设置附件// helper.addAttachment("test"+fileName, file);mailSender.send(message);log.info("带附件的邮件已经发送。");} catch (Exception e) {log.error("发送带附件的邮件时发生生异常!", e);}}@Overridepublic void sendInlineResourceMail(String to, String subject,String content, String rscPath, String rscId) {MimeMessage message = mailSender.createMimeMessage();try {MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);FileSystemResource res = new FileSystemResource(new File(rscPath));helper.addInline(rscId, res); //内嵌静态资源mailSender.send(message);log.info("嵌入静态资源的邮件已经发送。");} catch (Exception e) {log.error("发送嵌入静态资源的邮件时发生异常!", e);}}
}
  • from,即为邮件发送者,一般设置在配置文件中
  • to,邮件接收者,此参数可以为数组,同时发送多人
  • subject,邮件主题
  • content,邮件的主体
  • 邮件发送者 from 一般采用固定的形式写到配置文件中。

application.yaml中配置邮件服务器信息

spring:        mail:protocol: smtphost: smtp.qq.com #邮箱服务器主机,可以配置不用的邮件服务商  126  163  qqusername: xxxxxxxxxx@qq.com #  开通邮件授权功能的邮箱用户名password: xxxxxxxx #授权码port: 25 # 端口from: xxxxxxx@qq.com #实际发送邮件的邮箱地址发件人default-encoding: utf-8  #编码格式,设置邮件正文的编码格式,因为邮件可以发送富文本[即html代码,需要浏览器解析,解析使用什么编码通过该属性指定]properties: # 设置超时时间mail:smtp:connectiontimeout: 5000timeout: 3000writetimeout: 5000ssl: # 配置SSL 加密# 本地测试enable: falserequired: false# 开启debug模式,这样邮件发送过程的日志会在控制台打印出来,方便排查debug: true

扩展:其他邮箱服务器的配置方式:

在 application.properties 中添加邮箱配置,不同的邮箱参数稍有不同,下面面列举几个常用邮箱配置。

163 邮箱配置

spring.mail.host=smtp.163.com   // 邮箱服务器器地址
spring.mail.username=xxx@163.com // 用用户名
spring.mail.password=xxx        // 密码
spring.mail.default-encoding=UTF-8// 超时时间,可选
spring.mail.properties.mail.smtp.connectiontimeout=5000
spring.mail.properties.mail.smtp.timeout=3000
spring.mail.properties.mail.smtp.writetimeout=5000

126 邮箱配置

spring.mail.host=smtp.126.com 
spring.mail.username=xxx@126.com
spring.mail.password=xxx
spring.mail.default-encoding=UTF-8

QQ 邮箱配置如下:

spring.mail.host=smtp.qq.com
spring.mail.username=xxx@qq.com
spring.mail.password=xxx
spring.mail.default-encoding=UTF-8

测试时需要将 spring.mail.username 和 spring.mail.password 改成自自己邮箱对应的登录名和密码,这里的密码不是邮箱的登录密码,是开启 POP3 之后设置的客户端授权密码。

测试工具类方法:

在日常使用的过程中,我们通常在邮件中加入图片或者附件来丰富邮件的内容。

发送 HTML 格式邮件

邮件发送支持以 HTML 语法去构建自定义的邮件格式,Spring Boot 支持使用用 HTML 发送邮件。

我们在 MailService 中添加支持 HTML 邮件发送的方法:

public void sendHtmlMail(String to, String subject, String content) {MimeMessage message = mailSender.createMimeMessage();try {// true 表示需要创建一一个 multipart messageMimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);mailSender.send(message);logger.info("html邮件发送成功");} catch (MessagingException e) {logger.error("发送html邮件时发生生异常!", e);}
}

富文本邮件抄送使用:helper.addCc(cc) 来实现。

和文本邮件发送代码对比,富文本邮件发送使用 MimeMessageHelper 类,该类支持发送复杂邮件模板,支持文本、附件、HTML、图片等。

在测试类中构建 HTML 内容,测试发送:

@Test
public void testHtmlMail() throws Exception {String content = "<html>\n" + "<body>\n" + "<h3>hello world ! 这是一一封html邮件!</h3>\n" +"</body>\n" +"</html>";mailService.sendHtmlMail("xxxx@xxx.com","这是一封HTML邮件", content);
}

代码中拼接出的 HTML 的 String 字符串交给 MimeMessageHelper 来处理理,最后由邮件客户端负责渲染显示内容。

发送带附件的邮件

在 MailService 添加 sendAttachmentsMail 方法,发送带附件的邮件主要是使用 FileSystemResource 对文件进行封装,再添加到 MimeMessageHelper 中。

public void sendAttachmentsMail (String to, String subject, String content, String filePath) {MimeMessage message = mailSender.createMimeMessage();try {MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);FileSystemResource file = new FileSystemResource(new File(filePath));String fileName = file.getFilename();helper.addAttachment(fileName, file);// helper.addAttachment("test"+fileName, file);mailSender.send(message);logger.info("带附件的邮件已经发送。");} catch (MessagingException e) {logger.error("发送带附件的邮件时发生生异常!", e);}
}

添加多个附件可以使用多条 helper.addAttachment(fileName, file) 。

在测试类中添加测试方法:

@Test
public void sendAttachmentsMail() {String filePath = "e:\\temp\\fastdfs-client-java-5.0.0.jar";mailService.sendAttachmentsMail("xxx@xx.com", "主题:带附件的邮件", "有附件,请查收!", filePath);
}

附件可以是图片、压缩包、Word 等任何文件,但是邮件厂商一般都会对附件大小有限制,太大的附件建议使用网盘上传后,在邮件中给出链接。

发送带静态资源的邮件

邮件中的静态资源一般指图片,在 MailService 中添加 sendInlineResourceMail 方法:

public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId) {MimeMessage message = mailSender.createMimeMessage();try {MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);FileSystemResource res = new FileSystemResource(new File(rscPath));helper.addInline(rscId, res);mailSender.send(message);logger.info("嵌入静态资源的邮件已经发送。");} catch (MessagingException e) {logger.error("发送嵌入静态资源的邮件时发生异常!", e);}
}

在测试类中添加测试方法:

@Test
public void sendInlineResourceMail() {String rscId = "neo006";String content = "<html><body>这是有图片的邮件:<img src='cid:" + rscId + "' ></body></html>";String imgPath = "e:\\temp\\weixin.jpg";mailService.sendInlineResourceMail("xxxx@xxxx.com", "主题:这是有图片的邮件", content, imgPath, rscId);
}

添加多个图片可以使用多条 img src=‘cid:“+ rscId +”’ > 和 helper.addInline(rscId, res) 来实现。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com