SpringBoot邮件服务(二):自定义邮件格式

680 阅读4分钟

这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战

通过上一篇文章,学到如何在SpringBoot项目中使用工具发送一封邮件,文章地址:SpringBoot邮件服务(一):发送一封邮件

然鹅,在使用邮箱发送邮件时,是可以设置美观的内容格式、并携带图片文件等资源的。对于这些功能,我们的程序同样也可以实现!这次就让我们赋予程序更高级的认知,实现发送自定义格式、携带附件的邮件信息。

1. 预热

首先我们需要确认邮件服务的环境是否已经搭建成功,简单回顾一下邮件服务配置流程:

  1. 项目中引入>spring-boot-starter-mail依赖
  2. 配置文件中配置邮箱账户、账户密码或授权密码、邮箱服务器地址等信息
  3. 定义发送邮件类MailService,注入官方提供的JavaMailSender工具,注入配置的邮箱账户,完成邮箱发送逻辑
  4. 定义单元测试类,测试邮件发送功能

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内容为:

image.png

注:使用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);
}

执行成功后,得到结果邮件

image.png

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);
}

测试方法执行完成后,发送邮件内容为

image.png