Springboot项目使用465加密端口发送邮件验证码用以用户注册,部署在阿里云

近日写了一个Springboot练手小项目,有一个注册功能,想实现一个注册时用户接收验证码去注册,所以自然而然的想到了使用代码生成验证码后,存入Redis中一份,留作验证使用,Redis可以给key加有效时长,对于做验证码极为方便,然后再通过邮件将验证码发送给用户完成注册(毕竟短信验证码还要花钱啊啊啊啊~~,笔者超级穷的)。
此时便遇到了一个棘手的问题,普通发邮件一般使用25端口即可,在本地也是可以发送邮件的,但以阿里云为例的云服务器,一般都会默认屏蔽25端口,即使安全组中配置了25端口依旧无法发送邮件,阿里云上会提示使用第三方加密端口如:465端口。
这个时候问题来了,直接将配置文件上的port配置为465,连本地发送都异常了,别说部署到阿里云了,不用想为什么了,笔者负责任的告诉你们不是任何电脑环境的问题,是你们的配置写错了,笔者也这么写错了,Google上搜寻良久,才找到正确答案,所以在此分享给大家,希望能帮到大家。

废话不多说,先来贴一下发邮件的配置和代码,再解释大家就很清楚了

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.mail.internet.MimeMessage;
import java.util.concurrent.TimeUnit;

/**
 *
 * @date 2018/11/7
 */
@Slf4j
@Component
public class VerificationCodeUtil {

    //默认发件人(系统发送邮件)
    @Value("${spring.mail.username}")
    private String mailFrom;

    @Autowired
    private JavaMailSender javaMailSender;

    @Resource
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 注册人类型常量
     */
    private String TYPE_USER = "user";
    private String TYPE_STAFF = "staff";

    public void getVerificationCode(String email, String type) throws PetLoveHomeException{
        AssertUtils.notNull(type,"注册用户类型为空");
        AssertUtils.notNull(email,"邮箱号为空");
        //获取验证码字符串方法,自封装
        String verificationCode = GetSaltUtil.getSalt();

        MimeMessage message = null;
        /**
         * 如果为员工注册,验证码发给Root用户邮箱
         * 如果为普通用户注册,验证码发给注册者
         */
        String sendTo = null;
        if(TYPE_STAFF.equals(type)){
            sendTo = mailFrom;
        }else if(TYPE_USER.equals(type)){
            sendTo = email;
        }

        try {
            /*
            发送验证码邮件
             */
            message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(mailFrom,"myemail");
            helper.setTo(sendTo);
            helper.setSubject("myemail注册验证码");
            helper.setText("【myemail】您的注册验证码为:" + verificationCode +", 10分钟内有效。",false);
            javaMailSender.send(message);

            /*
            验证码存入redis
             */
            redisTemplate.opsForValue().set("verificationCode"+email, verificationCode, 10, TimeUnit.MINUTES);

        } catch (Exception ex) {
        	//笔者项目中自定义的一个运行时异常类,可自行定义替换,或直接用RunTimeException取代
            throw new PetLoveHomeException("邮件发送失败");
        }

    }

到此处,邮件发送的工具类就写好了,下面来看配置。(划重点~~嘻嘻)

spring:
  mail:
    default-encoding: UTF-8
    host: smtp.163.com
    username: ********@163.com
    password: **********
    properties:
      mail:
        smtp:
          starttls:
            enable: true
            required: true
          auth: true
          socketFactory:
            class: javax.net.ssl.SSLSocketFactory
            port: 465

看到这,大家应该很清楚了,哈哈哈

重点是配置文件的最后三行:

我们不仅要配置发邮件的端口号,还要配置上建立连接的SSL加密协议连接工厂类,你的代码才能建立一条真正的连接第三方邮件服务商的加密连接(此处以163为例,但其他服务商同理)。

此时,在此运行你的项目,你会发现,邮件服务已经可以正常使用了,希望可以帮到大家。

以上均为笔者亲测可用,如有其它技术方面的疑问,欢迎留言交流,笔者随时欢迎哦!

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值