发送邮件
-
邮箱设置
- 启用客户端SMTP服务
-
Spring Email
- 导入 jar 包
- 使用 JavaMailSender 发送邮件
邮箱设置
首先启用邮箱的SMTP服务,我直接使用我个人的qq邮箱。进入qq邮箱设置帐户页面,开启POP3/SMTP服务,按照下方提示生成授权码,qq邮箱强制使用授权码代替邮箱密码。
Spring Email
导入jar包
首先,在之前提到的搜索包的网站mvn上搜索spring mail,把配置复制到pom里。
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
使用JavaMailSender
将发送邮件封装成一个工具类,新建一个util包,包下新建MailSender类。因为发送邮件实际是邮箱服务器进行,我们这里写的实际是客户端。
package com.nowcoder.util;
import org.apache.velocity.app.VelocityEngine;
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.velocity.VelocityEngineUtils;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
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 VelocityEngine velocityEngine;
public boolean sendWithHTMLTemplate(String to, String subject,
String template, Map<String, Object> model) {
//to 发给谁 subject 标题 template使用的模板 model模板中变量的替换有哪些
try {
String nick = MimeUtility.encodeText("牛客中级课");//设置发件人昵称
InternetAddress from = new InternetAddress(nick + "<course@nowcoder.com>");//发件人邮箱
MimeMessage mimeMessage = mailSender.createMimeMessage();//邮件正文
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage);
String result = VelocityEngineUtils
.mergeTemplateIntoString(velocityEngine, template, "UTF-8", model);//调用VelocityEngineUtils直接渲染
mimeMessageHelper.setTo(to);
mimeMessageHelper.setFrom(from);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(result, true);
mailSender.send(mimeMessage);
return true;
} catch (Exception e) {
logger.error("发送邮件失败" + e.getMessage());
return false;
}
}
@Override
public void afterPropertiesSet() throws Exception {
mailSender = new JavaMailSenderImpl();
mailSender.setUsername("course@nowcoder.com");
mailSender.setPassword("NKnk123");
mailSender.setHost("smtp.exmail.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);
}
}
在LoginController的login方法中,添加红框部分代码。意思是 登陆异常,异步处理,需要放在队列中
LoginExceptionHandler:异常处理
package com.nowcoder.async.handler;
import com.nowcoder.async.EventHandler;
import com.nowcoder.async.EventModel;
import com.nowcoder.async.EventType;
import com.nowcoder.util.MailSender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class LoginExceptionHandler implements EventHandler {
@Autowired
MailSender mailSender;
@Override
public void doHandle(EventModel model) {
// xxxx判断发现这个用户登陆异常
Map<String, Object> map = new HashMap<String, Object>();
map.put("username", model.getExt("username"));
mailSender.sendWithHTMLTemplate(model.getExt("email"), "登陆IP异常", "mails/login_exception.html", map);
}
@Override
public List<EventType> getSupportEventTypes() {
return Arrays.asList(EventType.LOGIN);
}
}
login_exception.html:
你好$username,你的登陆有问题!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p67sKf8K-1601383341612)(C:\Users\dou\AppData\Roaming\Typora\typora-user-images\image-20200929202605939.png)]
es() {
return Arrays.asList(EventType.LOGIN);
}
}
login_exception.html:
`你好$username,你的登陆有问题!`
[外链图片转存中...(img-p67sKf8K-1601383341612)]
①通过velocityEngine把模板先渲染出来,这个模板就是邮件的主要内容。再通过连上在设置中的发送服务器,把邮件发出去。