最近在项目中用到一个定时通知功能,通知就联想到一个邮件通知的方式,此外通过邮件我们还可以进行用户通过邮件注册、通过邮件找回密码等功能,这篇博客就简单介绍以下邮件的发送功能。
在Java中,我们可以使用JavaMail API向任何电子邮件地址发送邮件,但是配置较为繁琐。Spring框架提供了一个JavaMailSender接口,进一步简化了邮件的配置,通过自动化配置类MailSenderAutoConfiguration,使得在Spring Boot应用中使用JavaMailSender更加方便。
一、项目前准备
1、依赖导入
在pom.xml中导入邮件实现依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2、开启邮件服务
(1)点击设置
(2)点击账户
(3)开启服务
下拉找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,点击开启,按照qq邮箱提示进行一步步验证,最后获得授权吗,记得复制,授权码可重复进行申请,每次申请的授权码可能不同。
3、创建邮件配置
该配置为yml格式配置
spring:
mail:
#配置smtp服务主机地址
# qq邮箱为smtp.qq.com 端口号465或587
# sina smtp.sina.cn
# aliyun smtp.aliyun.com
# 163 smtp.163.com 端口号465或994
host: smtp.qq.com
#发送者邮箱
username: xxxx@qq.com
#配置密码,注意不是真正的密码,而是刚刚申请到的授权码
password: xxxxx
#端口号465或587
port: 587
#默认的邮件编码为UTF-8
default-encoding: UTF-8
#其他参数
properties:
mail:
#配置SSL 加密工厂
smtp:
ssl:
#本地测试,先放开ssl
enable: false
required: false
#开启debug模式,这样邮件发送过程的日志会在控制台打印出来,方便排查错误
debug: true
二、发送邮件代码
1、简单邮件发送
(1)service层
@Resource
private JavaMailSender javaMailSender;
@Override
public void sendSimpleMail(String from, String to, String subject, String text) {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
// 发件人
simpleMailMessage.setFrom(from);
// 收件人
simpleMailMessage.setTo(to);
// 邮件主题
simpleMailMessage.setSubject(subject);
// 邮件内容
simpleMailMessage.setText(text);
javaMailSender.send(simpleMailMessage);
}
(2)controller层
@GetMapping("/sendSimpleMail")
public void sendSimpleMail() {
empRetireService.sendSimpleMail("发送方@qq.com",
"接收方@qq.com",
"test",
"感谢你这么可爱,这么优秀!!!!!!");
}
(3)postman进行测试
邮件展示:
2、复杂邮件分发
很多时候,邮件不止有简单的文字,很多邮件还可以携带样式和附件。
使用 javaMailSender
创建一个 MimeMessage
实例,用 MimeMessageHelper
设置开启内嵌和附件功能,然后通过 addInline
方法嵌入图片,addAttachment
方法添加附件。
(1)service层
@Override
public ResponseEntity<String> sendMimeMail(String from, String to, String subject, String text) {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
//辅助创建MIME消息的类,使用它可以更加方便地创建和发送电子邮件。true表示创建的是表示创建的是多部分消息
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
// 过调用helper.setText(text, true)设置邮件的内容,第二个参数true表示将邮件内容解析为HTML格式。您可以在text参数中编写HTML代码或普通文本。
helper.setText(text, true);
//通过调用helper.addInline()方法,将路径下的图片资源嵌入到邮件中。logo是嵌入资源的ID,可以在邮件内容中通过引用该ID来显示图片
helper.addInline("phone", new FileSystemResource("C:\\Users\\ASUS\\Desktop\\test图片\\"+"2020122122203861963.jpg"));
//添加附件:通过调用helper.addAttachment()方法,将doc/logo.pdf路径下的PDF文件作为附件添加到邮件中。logo.pdf是附件的文件名,可以在邮件中显示该附件并提供下载。
helper.addAttachment("20205622141367241.jpg", new FileSystemResource("C:\\Users\\ASUS\\Desktop\\test图片\\"+"20205622141367241.jpg"));
javaMailSender.send(mimeMessage);
return ResponseEntity.status(HttpStatus.CREATED).body("发送成功");
} catch (MessagingException e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("e.getMessage()");
}
}
*注意事项:
addAttachment
方法的第二个参数可指定附件文件的资源对象,可以使用ClassPathResource
、FileSystemResource
、ByteArrayResource
等实现:
ClassPathResource
:用于从类路径中加载资源文件。它使用相对于类路径的路径来查找并加载资源。FileSystemResource
:用于从文件系统中加载资源文件。它使用绝对或相对于当前工作目录的路径来查找并加载资源。以为我是直接从本地文件直接获取图片,所以采用FileSystemResource。
ByteArrayResource
:用于将字节数组作为资源进行封装。它适用于将内存中的数据作为资源传递,而不是从文件系统或类路径加载。
(2)controller层
@GetMapping("/sendMimeMail")
public ResponseEntity<String> sendMimeMail() {
return empRetireService.sendMimeMail("2842168871@qq.com",
"ly1398650@163.com",
"test1",
"<h1>感谢你这么可爱,这么优秀!!!!!!</h1><br>"+"<img src='cid:phone'>");
}
(3)Postman进行测试
邮箱展示: