准备工作
开启SMTP服务
前往你的邮箱网站,以网易邮箱为例,打开网易邮箱地址,登录你的邮箱,进入邮箱管理后台界面。点击“设置”》》“POP3/SMTP/IMAP”后,点击开启SMTP服务即可。
技术实现
Spring Boot 发送邮件验证码的功能,主要用到了spring-boot-starter-mail工具包实现邮件的发送功能,利用junit-vintage-engine工具包实现了html邮件模板功能,利用easy-captcha工具包生成随机验证码 的功能!
引入依赖
<!--引入mail依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!--mail模板-->
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--验证码-->
<dependency>
<groupId>com.github.whvcse</groupId>
<artifactId>easy-captcha</artifactId>
<version>1.6.2</version>
</dependency>
相关配置
然后再spring的配置文件中,设置mail相关配置:
spring:
mail:
host: smtp.yeah.com
username: 你的邮箱
password: 邮箱授权码
default-encoding: UTF-8
protocol: smtp
properties:
mail:
smtp:
auth: true # 启用SMTP认证
starttls:
enabled: true # 启用SMTP认证
required: true # 必须采用加密链接
代码实现
创建一个MailService类,实现邮件发送的功能,代码如下:
import com.tarzan.nav.modules.admin.service.sys.SysConfigService;
import com.tarzan.nav.utils.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.antlr.stringtemplate.StringTemplate;
import org.antlr.stringtemplate.StringTemplateGroup;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import java.io.UnsupportedEncodingException;
import java.util.Objects;
/**
* @author lsyong
*/
@Component("mailService")
@Slf4j
public class MailService {
private static final StringTemplateGroup templateGroup;
@Resource
private SysConfigService sysConfigService;
static{
String classpath = Objects.requireNonNull(MailService.class.getClassLoader().getResource("")).getPath();
templateGroup = new StringTemplateGroup("mailTemplates", classpath + "/mailTemplates");
}
public static String IMG_BASE_URL;
public static String ACTIVATE_CONTEXT="http:";
public static String RESET_PWD_CONTEXT;
@Value("${spring.mail.username}")
private String username;
@Resource
private JavaMailSender mailSender;
private void sendMail(String to, String subject, String body) {
MimeMessage mail = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(mail, true, "utf-8");
helper.setFrom(new InternetAddress(MimeUtility.encodeText(sysConfigService.getSiteName())+"<"+username+">").toString());
helper.setTo(to);
helper.setSubject(subject);
helper.setText(body, true);
helper.setSentDate(DateUtil.now());
mailSender.send(mail);
} catch (MessagingException|UnsupportedEncodingException e) {
log.error(e.getMessage());
}
}
/**
* send activation mail to
* @param to,key
*/
public void sendAccountActivationEmail(String to, String key){
StringTemplate activation_temp = templateGroup.getInstanceOf("activation");
activation_temp.setAttribute("img_base_url", IMG_BASE_URL);
activation_temp.setAttribute("email", to);
activation_temp.setAttribute("href", ACTIVATE_CONTEXT+key+"?email="+to);
activation_temp.setAttribute("link", ACTIVATE_CONTEXT+key+"?email="+to);
sendMail(to, sysConfigService.getSiteName()+"账户激活", activation_temp.toString());
}
@Async
public void sendEmailCode(String to, String code){
StringTemplate activation_temp = templateGroup.getInstanceOf("verificationCode");
activation_temp.setAttribute("img_base_url", IMG_BASE_URL);
activation_temp.setAttribute("email", to);
activation_temp.setAttribute("code", code);
sendMail(to, sysConfigService.getSiteName()+"邮箱验证码", activation_temp.toString());
}
/**
* send change password link to
* @param to,key
*/
public void sendResetPwdEmail(String to, String key){
StringTemplate activation_temp = templateGroup.getInstanceOf("resetpwd");
activation_temp.setAttribute("img_base_url", IMG_BASE_URL);
activation_temp.setAttribute("href", RESET_PWD_CONTEXT+"?key="+key+"&email="+to);
activation_temp.setAttribute("link", RESET_PWD_CONTEXT+"?key="+key+"&email="+to);
sendMail(to, sysConfigService.getSiteName()+"账户密码重置", activation_temp.toString());
}
}