这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」
通过上一篇文章,学到如何在SpringBoot项目中使用工具发送一封邮件,文章地址:SpringBoot邮件服务(一):发送一封邮件。
然鹅,在使用邮箱发送邮件时,是可以设置美观的内容格式、并携带图片文件等资源的。对于这些功能,我们的程序同样也可以实现!这次就让我们赋予程序更高级的认知,实现发送自定义格式、携带附件的邮件信息。
1. 预热
首先我们需要确认邮件服务的环境是否已经搭建成功,简单回顾一下邮件服务配置流程:
- 项目中引入
>spring-boot-starter-mail
依赖 - 配置文件中配置邮箱账户、账户密码或授权密码、邮箱服务器地址等信息
- 定义发送邮件类
MailService
,注入官方提供的JavaMailSender
工具,注入配置的邮箱账户,完成邮箱发送逻辑 - 定义单元测试类,测试邮件发送功能
2. 自定义邮件格式
2.1 HTML格式
定义sendHTMLStyleMail()方法来发送HTML格式邮件
/**
* 发送HTML格式邮件
*/
public void sendHTMLStyleMail(String to, String subject, String content){
log.info("发送HTML格式邮件,收件人:{},主题:{},内容:{}",to,subject,content);
//使用MimeMessage发送复杂邮件
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
//设置开启multiparty email
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage,true);
messageHelper.setFrom(fromEmail);
messageHelper.setTo(to);
messageHelper.setSubject(subject);
//设置解析为html
messageHelper.setText(content,true);
javaMailSender.send(mimeMessage);
log.info("邮件发送完成!");
} catch (MessagingException e) {
log.info("邮件发送失败,错误信息:{}",e);
}
}
- 发送HTML格式内容时,使用
org.springframework.mail.javamail
包的MimeMessageHelper
类 - 创建
MimeMessageHelper
时传入true参数,代表开启Multipart email,此时邮件中允许添加附件和内嵌资源。 - setText()方法设置内容时第二个参数true代表内容解析为HTML
在单元测试中定义测试方法,并调用发送HTML格式邮件
@Test
public void testSendHTMLStyleMail(){
log.info("测试HTML格式邮件发送功能 => ");
String to = "104123456@qq.com";
String subject = "发送HTML格式邮件";
StringBuilder content = new StringBuilder();
content.append("<html>");
content.append("<body style="background-color:PowderBlue;">");
content.append("<h1>标题:SpringBoot发送HTML邮件</h1>");
content.append("<p style="font-size:30px;color:red"> 这里是正文:字体大小20px,红色 </p>");
content.append("</html>");
emailService.sendHTMLStyleMail(to,subject,content.toString());
}
测试成功后,邮箱接收到邮件内容,解析HTML内容为:
注:使用QQ邮箱接收邮件时可能无法解析html格式,163邮箱显示正常。
2.2 添加附件
定义sendHasAttachmentMail()方法来发送携带附件的邮件
/**
* 发送带附件的邮件
*/
public void sendHasAttachmentMail(String to, String subject, String content, String filePath){
log.info("发送携带附件邮件,收件人:{},主题:{},内容:{},文件路径:{}",to,subject,content,filePath);
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage,true);
messageHelper.setFrom(fromEmail);
messageHelper.setTo(to);
messageHelper.setSubject(subject);
messageHelper.setText(content,true);
//添加本地文件作为邮件附件,可以重复添加多个文件附件
File file = new File(filePath);
FileSystemResource attachment = new FileSystemResource(file);
messageHelper.addAttachment("测试.zip",attachment);
javaMailSender.send(mimeMessage);
log.info("邮件发送完成!");
} catch (MessagingException e) {
log.error("邮件发送失败,错误信息:{}",e);
}
}
- 发送携带附件的邮件时同样是使用邮件服务的
MimeMessage
类 - 文件通过指定本地路径添加到邮件附件中
定义测试方法,来验证携带附件邮件的发送
@Test
public void testSendHasAttachmentMail(){
log.info("测试携带附件邮件发送功能 => ");
String to = "104123456@qq.com";
String subject = "发送携带附件邮件";
String content = "<html><h1>标题:SpringBoot发送携带附件邮件</h1></html>";
String filePath = "/D:/Download/测试.zip";
emailService.sendHasAttachmentMail(to,subject,content,filePath);
}
执行成功后,得到结果邮件
2.3 静态资源文件
静态资源一般是指图片文件,在邮件内容中,可以根据HTML语法格式设置img标签的路径信息,一次引入本地图片文件,并最终解析到邮件内容中。
定义sendStaticPictureMail()方法来发送内嵌静态文件的邮件
/**
* 发送带静态文件的邮件
*/
public void sendStaticPictureMail(String to, String subject, String content, String contentId, String filePath){
log.info("发送携带静态资源邮件,收件人:{},主题:{},内容:{},内容id:{},文件路径:{}",to,subject,content,contentId,filePath);
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage,true);
messageHelper.setFrom(fromEmail);
messageHelper.setTo(to);
messageHelper.setSubject(subject);
messageHelper.setText(content,true);
//添加本地图片路径,用于解析到HTML中
File file = new File(filePath);
FileSystemResource picture = new FileSystemResource(file);
//将静态文件作为内嵌资源
messageHelper.addInline(contentId,picture);
javaMailSender.send(mimeMessage);
log.info("邮件发送完成!");
} catch (MessagingException e) {
log.error("邮件发送失败,错误信息:{}",e);
}
- 发送携带附件的邮件时依然使用邮件服务的
MimeMessage
类 - 图片文件通过指定本地路径,并通过指定的contentId对应的HTML的img标签中
- messageHelper中设置静态图片作为内嵌资源
定义单元测试方法
@Test
public void testStaticPictureMail(){
log.info("测试携带静态资源邮件发送功能 => ");
String to = "104123456@qq.com";
String subject = "发送携带静态资源邮件";
String contentId = "20220120";
String content = "<html><h1>标题:SpringBoot发送携带静态资源邮件</h1> <img src='cid:" + contentId + "' > </html>";
String filePath = "D:/Download/壁纸/20220120.png";
emailService.sendStaticPictureMail(to,subject,content,contentId,filePath);
}
测试方法执行完成后,发送邮件内容为