Springboot发送邮件及所遇到的超时问题

本篇主要介绍的是如何在Springboot中发送邮件,这个场景很容易遇到,比如我们在注册一个账号的时候,系统会提示你接收一个邮件验证码,这个时候,就需要在后台配置相关参数并发送该邮件了。具体怎么实现的呢,请往下看:

    1. 添加pom依赖
      <!--邮件-->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
      </dependency>
    
    1. 获取邮箱授权码。这里以QQ邮箱为例,我们登陆QQ邮箱,找到设置-邮箱设置-账户-POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,选择开启POP3/SMTP服务,此时会得到一个授权码,妥善保管,以下会用到的。
      image.png
  • 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邮箱提供的帮助信息是这样的:
      image.png
    • 我就正常的添加了发送端口这一项配置,可情况还是一样,在mac上可以发送,但是在windows上报的错误和上面一样,只是其中的端口变成了port: 465。经过了一些查询,找到了这样一句话:
      465端口(SMTPS):465端口是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议,
      它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。
      SMTPS和SMTP协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露,
      还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。
      
    • 这时候我就怀疑是不是自己漏掉了邮箱的ssl配置,经过搜索,得到了上面的ssl配置,此时,windows上报超时的问题就解决了。


      image.png
    1. 定义发送邮件的实现类
    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);
      }
    }
    
    1. 就可以直接发送啦
    mailService.sendDefaultMail( "收件人的邮箱","主题", "邮件内容");
    

这是之前实现过的,前天晚上部署的时候发现的问题,这里拿出来做个记录,实现的代码不是重点,问题才是重点;如果你也遇到相同的问题,希望能帮到你。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容