springboot实现邮件发送的功能
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2.在application.properties配置(这里以网易邮箱为例)
usename为你的邮箱
password为你的邮箱的客户端授权密码,这个需要自己去设置的,不是你邮箱的登录密码
spring.mail.host=smtp.163.com
spring.mail.username=xxxxxxx@163.com
spring.mail.password=xxxxxxxx #开启POP3之后设置的客户端授权码
spring.mail.protocol=smtp
spring.mail.default-encoding=UTF-8
3.相关代码:(这里不仅仅是写测试类,模拟用户从页面发起请求)
①controller
@Controller
public class SendEmailController {
@Autowired
private IEmailService emailService;
/**
* 发送验证邮箱
*
* @param email
* @return
*/
@RequestMapping("sendEmail")
@ResponseBody
public AjaxResult sendEmail(String email) {
AjaxResult json = new AjaxResult();
this.emailService.sendVerifyEmail(email, UserContext.getCurreentUser().getId());
return json;
}
}
②service实现类
@Service
public class EmailServiceImpl implements IEmailService{
@Autowired
private IUserInfoService userinfoService;
@Autowired
private JavaMailSender javaMailSender;
@Autowired
private MailVerifyMapper mailVerifyMapper;
@Value("${spring.mail.host}")
private String host;
@Value("${spring.mail.username}")
private String username;
@Value("${spring.mail.password}")
private String password;
@Override
public void sendVerifyEmail(String email,Long userId) {
UserInfo current = this.userinfoService.get(userId);
if (!current.getIsBindEmail()) {
// 发送验证邮箱
// 1,创建一个邮箱验证对象;
MailVerify mVerify = new MailVerify();
mVerify.setEmail(email);
mVerify.setSendTime(new Date());
mVerify.setUserId(userId);
// 2,生成一个uuid;
mVerify.setUuid(UUID.randomUUID().toString());
// 3,构造邮件内容;
StringBuilder sb = new StringBuilder(100).append("这是一封验证邮件,请点击<a href='").append("/bindEmail?uuid=").append(mVerify.getUuid()).append("'>这里</a>完成验证,有效期为").append(Consts.EMAIL_VAILED_DAY).append("天");
// 4,发送邮件;
//System.out.println(sb);
try {
JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();
senderImpl.setHost(host);
senderImpl.setUsername(username);
senderImpl.setPassword(password);
//建立邮件消息,发送简单邮件和html邮件的区别
MimeMessage mailMessage = senderImpl.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage,"utf-8");
//设置收件人,寄件人
messageHelper.setTo(email);
messageHelper.setFrom(username);
messageHelper.setSubject("测试HTML邮件!");
messageHelper.setText(sb.toString(),true);
Properties prop= new Properties();
//将这个参数设为true,让服务器进行认证,认证用户名和 密码是否正确
prop.put("mail.smtp.auth","true");
//设置超时时间
prop.put("mail.smtp.timeout", "25000");
senderImpl.setJavaMailProperties(prop);
//发送邮件
senderImpl.send(mailMessage);
this.mailVerifyMapper.insert(mVerify);
} catch (MessagingException e) {
throw new RuntimeException("发送邮件失败");
}
}
}
}
js如下:具体页面没有写出
<script type="text/javascript">
$(function () {
$("#showBindEmailModal").click(function(){
$("#bindEmailModal").modal("show");
});
$("#bindEmail").click(function(){
$("#bindEmailForm").ajaxSubmit({
dataType:"json",
success:function (data) {
if(data.success){
$.messager.confirm("提示","验证邮箱发送成功",function () {
window.location.reload();
});
}else{
$.messager.popup(data.msg);
}
}
});
});
})
</script>
这里为了安全,设置了UUID,通过UUID去数据库查询数据
打印出来的请求是:
这是一封验证邮件,请点击<a href='http://localhost:8080/bindEmail?uuid=a6552eab-da64-4824-aeb4-c632ac3b94fd'>这里</a>完成验证,有效期为5天
4.邮箱中收到的效果如下:
5.当你在点击"这里"时,会跳往一个页面,也就是确认绑定邮箱
业务逻辑如下:
①controller
/**
* 绑定邮箱
*/
@RequestMapping("bindEmail")
public String bindEmail(String uuid, Model model) {
try {
this.userInfoService.bindEmail(uuid);
model.addAttribute("success", true);
} catch (Exception e) {
model.addAttribute("success", false);
model.addAttribute("msg", e.getMessage());
}
return "checkmail_result";
}
②service实现类
@Override
public void bindEmail(String uuid) {
// 根据uuid得到邮箱验证对象
MailVerify mv = this.mailVerifyMapper.selectByUUID(uuid);
if (mv != null) {
UserInfo userinfo = this.get(mv.getUserId());
if (!userinfo.getIsBindEmail()// 判断1,用户是否绑定邮箱;
&& DateUtil.getSecondsBetween(mv.getSendTime(), new Date()) <= Consts.EMAIL_VAILED_DAY * 24
* 3600) {
// 判断1,用户是否绑定邮箱;2,在有效期之内
// 设置邮箱,并设置状态码
userinfo.setEmail(mv.getEmail());
userinfo.addState(BitStatesUtils.OP_BIND_EMAIL);
this.update(userinfo);
return;
} else {
throw new RuntimeException("超过有效期!");
}
} else {
throw new RuntimeException("绑定错误!");
}
}
③网页内容
<!-- 网页内容 -->
<div class="container" style="min-height: 343px;">
<h1>
<#if success??>
您的邮件已经成功激活,请登录系统查看!
<#else>
您的邮件激活失败,失败原因是:${msg}!
</#if>
</h1>
</div>