本篇主要介绍的是如何在Springboot中发送邮件,这个场景很容易遇到,比如我们在注册一个账号的时候,系统会提示你接收一个邮件验证码,这个时候,就需要在后台配置相关参数并发送该邮件了。具体怎么实现的呢,请往下看:
-
- 添加pom依赖
<!--邮件--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
- 获取邮箱授权码。这里以QQ邮箱为例,我们登陆QQ邮箱,找到
设置-邮箱设置-账户-POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV
服务,选择开启POP3/SMTP服务
,此时会得到一个授权码,妥善保管,以下会用到的。
- 获取邮箱授权码。这里以QQ邮箱为例,我们登陆QQ邮箱,找到
-
3.applocation.properties中添加如下配置,yml文件请自行转换格式
# 邮箱相关变量 #这里以QQ邮箱为例 #QQ邮箱服务器 spring.mail.host=smtp.qq.com #你的QQ邮箱账户 spring.mail.username=123456@qq.com #你的QQ邮箱第三方授权码 spring.mail.password=xxxxxxxxxxxxxxxxx #编码类型 spring.mail.default-encoding=UTF-8 #发送端口 spring.mail.port=465 #ssl spring.mail.properties.mail.smtp.ssl.enable=true
- 注意,我在本地调试的时候,没有加上面的
发送端口
和ssl
两个配置,是没问题的,正常的能发送,我的电脑是mac系统;当我将项目部署到我的一个windows服务器上的时候,邮箱发送这个功能就出现了问题,出现类似如下错误信息
ERROR: Problem while sending message: javax.mail.MessagingException: Could not connect to SMTP host: smtp.qq.com, port: 25, response: -1
- 搜索了一圈解决方案,统一的解决方案是让我添加
发送端口
配置项,修改默认的25端口为465端口,原因是QQ邮箱提供的帮助信息是这样的:
- 我就正常的添加了
发送端口
这一项配置,可情况还是一样,在mac上可以发送,但是在windows上报的错误和上面一样,只是其中的端口变成了port: 465
。经过了一些查询,找到了这样一句话:465端口(SMTPS):465端口是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议, 它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。 SMTPS和SMTP协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露, 还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。
-
这时候我就怀疑是不是自己漏掉了邮箱的ssl配置,经过搜索,得到了上面的ssl配置,此时,windows上报超时的问题就解决了。
- 注意,我在本地调试的时候,没有加上面的
-
- 定义发送邮件的实现类
package com.mutou.jobs.service; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Service; /** 邮件service. * @author 杨喜存 * @since 2019/12/6 11:22 AM */ @Service public class MailService { @Value("${spring.mail.username}") private String mail_username; @Resource private JavaMailSender mailSender; public void sendDefaultMail(String to, String subject, String content){ SimpleMailMessage message = new SimpleMailMessage(); message.setTo(to);//收信人 message.setSubject(subject);//主题 message.setText(content);//内容 message.setFrom(mail_username);//发信人 mailSender.send(message); } }
-
- 就可以直接发送啦
mailService.sendDefaultMail( "收件人的邮箱","主题", "邮件内容");
这是之前实现过的,前天晚上部署的时候发现的问题,这里拿出来做个记录,实现的代码不是重点,问题才是重点;如果你也遇到相同的问题,希望能帮到你。