近日写了一个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为例,但其他服务商同理)。
此时,在此运行你的项目,你会发现,邮件服务已经可以正常使用了,希望可以帮到大家。
以上均为笔者亲测可用,如有其它技术方面的疑问,欢迎留言交流,笔者随时欢迎哦!