使用场景
注册验证,注册各大网站,通常需要输入邮件地址,在注册成功后,会发送一封邮箱验证的邮件,点击确认,证明这个邮箱是用户自己的
网站营销,公司运营做活动的时候,提前几天给用户发邮件,提醒老用户在活动时间参加活动。
安全防线, 一个网站好久不用的时候,会忘记密码,这个时候需要找回密码,很多种找回方式,最常用的找回方式就是通过邮箱找回密码。
首先,在网站输入邮箱,系统会根据注册的邮箱发送一封邮件,根据邮件中的地址,可以重新设置新的密码。
触发机制, 定时邮件的发送,计算机忘记关机,发送一个特殊的邮件,让计算机自动关机。
提醒,监控告警, 如果系统没有监控,将是一种灾难性的事件,系统被实时的监控起来,出了问题,第一时间通知到开发人员,在事态没有扩散,影响最小的时候把问题解决掉。
邮件发送原理
邮件传输协议(早期):
SMTP协议:简单传输协议,原地址到目标地址传输的规范,重要特点,能在传送中接力传送邮件,
POP3协议:从邮件服务器上下下载协议。
后期增加的协议:
IMAP协议:对POP3协议的补充
Mime协议:二进制有关
邮件发送流程:
实战
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
配置文件:
application.yaml配置文件
spring:
mail:
host: smtp.qq.com
username: //账户记得加后缀qq.com
password: //授权码不是密码
default-encoding: UTF-8
简单(文本)邮件
/**
* 参数:
* 发送给谁
* 发送主题
* 发送内容
*/
@Service
public class MailService {
@Value("${spring.mail.username}")//注意加花括号
private String from;
@Autowired
private JavaMailSender javaMailSender;//不要new
public void sendSimpleMail(String to,String subject,String content)
{
SimpleMailMessage message=new SimpleMailMessage();
message.setTo(to);
message.setSubject(subject);
message.setText(content);
message.setFrom(from);
javaMailSender.send(message);
}
}
测试
@Test
void test1()
{
mailService.sendSimpleMail("xxxxxxxxxxx@qq.com","测试邮件","hellow,这是帝封邮件!");
System.out.println("发送成功!");
}
常犯的错误:
如果交给spring管理就用@Autowired注入,new 的话为空
HTML文件邮件()
public void sendHTMLMail(String to,String subject ,String content) throws MessagingException {
MimeMessage mimeMessage= javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper =new MimeMessageHelper(mimeMessage,true);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(content,true);
mimeMessageHelper.setFrom(from);
javaMailSender.send(mimeMessage);
}
带附件的邮件
public void sendFileMail(String to,String subject ,String content,String filePath) throws MessagingException {
MimeMessage mimeMessage= javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper =new MimeMessageHelper(mimeMessage,true);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(content,true);
mimeMessageHelper.setFrom(from);
FileSystemResource file=new FileSystemResource(new File(filePath));
String fileName=file.getFilename();
mimeMessageHelper.addAttachment(fileName,file);//如果多个邮件批量发,参数设为数组,遍历数组多次执行mimeMessageHelper.addAttachment(fileName,file)
javaMailSender.send(mimeMessage);
}
带图片的邮件
public void sendPactureMail(String to,String subject ,String content,String srcPath,String srcId) throws MessagingException {
MimeMessage mimeMessage= javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper =new MimeMessageHelper(mimeMessage,true);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(content,true);
mimeMessageHelper.setFrom(from);
FileSystemResource file=new FileSystemResource(new File(srcPath));
mimeMessageHelper.addInline(srcId, file);
javaMailSender.send(mimeMessage);
}
模板邮件
thymeleaf依赖
写html(thymeleaf),
使用TemplateEngine 解析HTML,Context(import org.thymeleaf.context.Context;)设置参数
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>你好,感谢您的注册,这是一封验证邮件</h1>
<!--/*@thymesVar id="id" type=""*/-->
<a href="#" th:href="@{https://www.baidu.com/{id}(id=${id})}">激活账号</a>
</body>
</html>
@Resource
private TemplateEngine templateEngine;
@Test
void test4()
{
Context context=new Context();
context.setVariable("id","11");
String content=templateEngine.process("index.html",context);
try {
mailService.sendHTMLMail("xxxxxxx@qq.com","测试邮件",content);
} catch (MessagingException e) {
e.printStackTrace();
}
System.out.println("发送成功!");
}
异常的处理
使用loginfo打印参数等