SpringBoot发送邮件及在linux系统中发送邮件失败的解决办法

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也可以成功,为什么?

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值