Spring Boot 发送邮件以及踩过的坑(Linux、465、ssl、email)

本文详细介绍了如何在Spring Boot项目中整合邮件发送功能,包括引入依赖、配置application.yml、自定义EmailUtil工具类以及测试方法。同时,针对在阿里云Linux服务器上遇到的连接超时问题,提供了详细的解决方案,包括修改端口、SSL配置及信任证书设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一、简单实现

1.引入依赖

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

2. application.yml配置

spring:
  mail:
    host: smtp.163.com
    username: xxx@163.com
    password: xxxxxx			#有的是授权码,有的是密码
    protocol: smtp

默认端口25

3.EmailUtil工具类,自己写

@Component
public class EmailUtil {
    @Resource
    private JavaMailSender mailSender;
    @Value("${spring.mail.username}")
    private String from;
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    public void send(String to, String subject, String text) {
        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper helper = null;
        try {
            helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(text, true);
        } catch (MessagingException e) {
            logger.error(e.getMessage());
        }
        mailSender.send(message);
        logger.info("发送成功");
    }
}

4.测试

@SpringBootTest
class ServerApplicationTests {
    @Resource
    private EmailUtil emailUtil;

    @Test
    void contextLoads() {
        emailUtil.send("xxx@qq.com","模板邮件","xxx");
    }

}

二、踩过的坑

本地电脑是windows环境,通过简单实现就能发送邮件了。

问题:服务器是阿里云linux的,这种情况下会出错误提示,连接超时。

Couldn't connect to host, port: xxx.xxx.xxx.xxx, 25; timeout -1;

网上说,linux无法自动解析域名,需要先将邮件服务器地址host解析成ip

解析之后还是会报错。

根据网上说法是,阿里云25号端口没开,开了之后发现还是不行。

使用命令发现,邮件服务器端的25端口连接不上

telnet xxx.xxx.xxx.xxx 25

使用命令发现,邮件服务器端的465端口能连接上

telnet xxx.xxx.xxx.xxx 465

然后把port改成465,出现以下错误

Could not connect to SMTP host: 202.101.149.132, port: 465, response: -1

465端口是ssl协议,需要进行配置

application.yml配置修改为:

spring:
  mail:
    host: xxx.xxx.xxx.xxx
    username: xxx
    password: xxx
    protocol: smtp
    port: 465
    default-encoding: UTF-8
    properties:
      mail.smtp.auth: true
      mail:
        smtp:
          ssl:
            enable: true
      mail.smtp.socketFactory.port: 465
      mail.smtp.socketFactory.class: javax.net.ssl.SSLSocketFactory
      mail.smtp.socketFactory.fallback: false

修改完成后,报错

 PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

问题原因是因为信任证书,百度了很久没有找到合适的方法,后来试着把邮件服务器地址加入信任,就可以了。

最终配置如下:

spring:
  mail:
    host: xxx.xxx.xxx.xxx
    username: xxx
    password: xxx
    protocol: smtp
    port: 465
    default-encoding: UTF-8
    properties:
      mail.smtp.auth: true
      mail:
        smtp:
          ssl:
            enable: true
            trust: xxx.xxx.xxx.xxx
      mail.smtp.socketFactory.port: 465
      mail.smtp.socketFactory.class: javax.net.ssl.SSLSocketFactory
      mail.smtp.socketFactory.fallback: false

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值