SpringBoot发送邮件及在linux系统中发送邮件失败的解决办法
场景:公司最近在做一个数据配置中心的项目,其中有一个模块是监控网址并发送邮件给用户的功能,具体的邮箱配置样式如图所示:
这是用户可以自己自定义配置发件邮箱的模式,同时也可以不配置发件邮箱,拿系统配置的默认邮箱发送,系统默认邮箱的配置信息在yml中如图所示:
问题的定位和解决:
当时部署到linux服务器上后,在测试进行验证的时候,发现邮件无法发送,一直在提示:“系统错误,请稍后重试”,在网上查找了各种文章后,提供了各种解决方案,在经过各种尝试后依然没有解决问题。
后来直到看到一篇文章,内容是这样的:
参考地址:图片对应来源,其中他说ssl配置后,linux系统不支持25端口,需要切换到465端口。那么我的系统配置端口是587是不是也不支持呢?在调用命令:netstat -ntlp 查看后发现确实是这样的,根本就没有587端口,那么接下来就是如何开启对应的587端口了。
开启587端口的方式:
1.开启防火墙 systemctl start firewalld
2.开放指定端口 firewall-cmd --zone=public --add-port=1935/tcp --permanent
经过这两个步骤:完美开启对应端口并发送邮件 参考博客
附上代码如何发送邮件:
/**
* @param sendMailInfo 发送邮件所需信息
* @param testSend 测试发送
* @return 无返回
* @Description 通过邮箱地址等发送邮件
* @author yuanshihang
* @date 2020/12/30 17:30
*/
public static void sendMail(AddMonitorEmailParamsModel sendMailInfo, List<MonitorResultModel> resultList,
Boolean testSend, JavaMailSenderImpl mailSender, VelocityEngine velocityEngine, String fileName, String filePath) {
mailSender.setHost(sendMailInfo.getFromHost());
mailSender.setPort(sendMailInfo.getFromPort());
mailSender.setUsername(sendMailInfo.getFromMail());
mailSender.setPassword(sendMailInfo.getFromApiKey());
String mailThemeName = "这是主题一";
if (!testSend) {
mailThemeName = "这是主题二";
}
try {
//邮件附件的文件名不被分隔转码
System.getProperties().setProperty("mail.mime.splitlongparameters", "false");
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
//获取收件邮箱地址
String toMail = sendMailInfo.getToMail();
//设置发送邮箱地址
helper.setFrom(sendMailInfo.getFromMail());
//设置收件邮箱地址
helper.setTo(toMail);
//设置邮件的标题
helper.setSubject(mailThemeName);
if (testSend) {
helper.setText("主题一对应的内容,这就是一段话,直接输出在邮件中");
} else {
//设置模板生成器
VelocityContext context = new VelocityContext();
//获取模板配置地址
String templatePath = "static/template/databaseMonitorMail.vm";
//导入模板中对应的数据
context.put("resultList", resultList);
StringWriter stringWriter = new StringWriter();
velocityEngine.mergeTemplate(templatePath, "UTF-8", context, stringWriter);
String text = stringWriter.toString();
//转换为String text文本并导入邮件生成器中
helper.setText(text, true);
//添加附件文件,通过地址获取文件,指定文件名
FileSystemResource fileSystemResource = new FileSystemResource(filePath);
helper.addAttachment(fileName, fileSystemResource);
}
mailSender.send(mimeMessage);
} catch (Exception ex) {
if (testSend) {
throw new CustomException("很抱歉,邮件测试发送失败,请检查邮件发送配置信息");
} else {
log.error("某某邮件发送错误,错误原因:" + ex.getMessage(),ex);
}
}
}
对应jar包:
<!-- 邮件发送 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!-- 模板引擎 代码生成 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.1</version>
</dependency>
最后思考:
我只是在linux系统中开启了yml中配置的ssl的587端口,但是由于用户可以自己配置系统的发件邮箱,配置的端口号不是587也可以成功,为什么?