SpringBoot配置发送Email
(1)引入依赖
<!--引入邮件依赖-->
<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
(2)开启邮箱的相关服务
(3)写一个实现邮箱配置和发送功能的实现类
package com.springboot.springboot.utils;
import freemarker.template.Template;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
* Created by nowcoder on 2016/7/15. // course@nowcoder.com NKnk66
*/
@Service
public class MailSender implements InitializingBean {
private static final Logger logger = LoggerFactory.getLogger(MailSender.class);
private JavaMailSenderImpl mailSender;
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer; //FreeMarker的技术类
//private FreeMarkerConfigurer freeMarkerConfigurer=null; //FreeMarker的技术类
public void setFreeMarkerConfigurer(FreeMarkerConfigurer freeMarkerConfigurer) {
this.freeMarkerConfigurer = freeMarkerConfigurer;
}
public boolean sendWithHTMLTemplate(String to, String username,String subject) {
try {
String nick = MimeUtility.encodeText("Wilson"); //发件人的昵称
InternetAddress from = new InternetAddress(nick + "<zysong0709@foxmail.com>"); //发件人是谁
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage,true);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setFrom(from);
mimeMessageHelper.setSubject(subject);
String result =getMailText(username);// 使用模板生成html邮件内容
mimeMessageHelper.setText(result, true);
mailSender.send(mimeMessage);
return true;
} catch (Exception e) {
logger.error("发送邮件失败" + e.getMessage());
return false;
}
}
//通过模板构造邮件内容,参数username将替换模板文件中的${username}标签。
private String getMailText(String username){
String htmlText="";
try {
//通过指定模板名获取FreeMarker模板实例
Template tpl=freeMarkerConfigurer.getConfiguration().getTemplate("mailMessage.html");
//FreeMarker通过Map传递动态数据
Map map=new HashMap();
map.put("username",username); //注意动态数据的key和模板标签中指定的属性相匹配
//解析模板并替换动态数据,最终username将替换模板文件中的${username}标签。
htmlText= FreeMarkerTemplateUtils.processTemplateIntoString(tpl,map);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return htmlText;
}
//邮箱的基础设置
@Override
public void afterPropertiesSet() throws Exception {
mailSender = new JavaMailSenderImpl();
mailSender.setUsername("****@xxxx.com"); //邮箱
mailSender.setPassword("*********"); //这个是你打开pop3/smtp服务时的给的那个授权码,不是邮箱的密码
mailSender.setHost("smtp.qq.com");
//mailSender.setHost("smtp.qq.com");
mailSender.setPort(465);
mailSender.setProtocol("smtps");
mailSender.setDefaultEncoding("utf8");
Properties javaMailProperties = new Properties();
javaMailProperties.put("mail.smtp.ssl.enable", true);
//javaMailProperties.put("mail.smtp.auth", true);
//javaMailProperties.put("mail.smtp.starttls.enable", true);
mailSender.setJavaMailProperties(javaMailProperties);
}
}
这里有一个需要注意的坑,就是像我在注释中写的那样子
mailSender.setPassword("*********");
里面的密码是pop3和smtp服务开启时给耳朵授权码,不是邮箱的登陆密码
(4)模板
上面有一个template也就是你发送邮件的模板,这个根据你自己使用的模板解析引擎来自己定制
我这里就为了实现这个功能做了一个最简陋的来验证下功能,模板引擎freemarker
恭喜您成功注册!您的用户名为:${username!}
这里的username是需要解析的变量,会有相应的参数传入的
(5)触发事件
然后怎么样才能发送邮件呢?不能说随便就要发吧?总要有什么事件来触发吧?比如说要验证邮箱,或者是登陆异常然后发邮件提醒等等这样的功能。我这里是写了一个登陆异常然后发送邮件提醒的功能,就是当登陆出现异常的时候,比如ip地址异常,然后触发相应的事件
//用户登陆完设置一个事件
eventProducer.fireEvent(new EventModel(EventType.LOGIN)
.setExts("username",username).setExts("email", "1390505180@qq.com"));
// .setActorId((int)map.get("user_id"))); //用户登陆完之后判断是谁登录的
//当读取到的next字段不为空的话跳转
(6)事件的handler
有触发的事件,当然有相应的handler去处理这个事件。
package com.springboot.springboot.async.handler;
import com.springboot.springboot.async.EventHandler;
import com.springboot.springboot.async.EventModel;
import com.springboot.springboot.async.EventType;
import com.springboot.springboot.utils.MailSender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
/**
* @author WilsonSong
* @date 2018/6/5
* 用来处理登陆异常的事件
*/
@Component //在容器中自动注册
public class LoginExceptionHandler implements EventHandler {
@Autowired
MailSender mailSender;
@Override
public void doHander(EventModel model) {
//判断发现用户登陆异常
mailSender.sendWithHTMLTemplate(model.getExts("email"), model.getExts("username"),"登陆IP异常");
}
@Override
public List<EventType> getSupportEventTypes() {
return Arrays.asList(EventType.LOGIN); //这里只关心登陆这个事件
}
}
到此邮件就通过异步队列的方式实现了邮件的发送功能。用异步的好处就是可以同时处理,并且防止冲突。