使用springboot发送复杂类型正文的邮件

时间:2022-07-23
本文章向大家介绍使用springboot发送复杂类型正文的邮件,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

缘起

日前,客户需要项目中有发送邮件功能,并且给了一个邮件模板是excel的

image.png

需要在邮件正文中按照这个模板显示出来,经过一般折腾,最后实现了这个功能,效果如下

image.png

可以看到是把excel模板内容插入到了邮件的正文中,那么这是如何实现的呢?

实现思路

在java中发送邮件,是可以采用模板功能的。大概思路也就是定义好一个模板,然后再模板的对应位置打上标记,再用代码给这些标记赋值就行。

模板类型以ftl结尾,一个可用的模板类似如下

image.png

可用看到,模板基本上就是一个html形式,那么下一步就是思考如何把一个excel转成html文件,这里可以用excel的另存为功能

image.png

另存为之后,可以在桌面看到html文件和css文件以及一些图片文件,这里html文件中引用了CSS,图片等,但是模板中好像是不能通过相对路径去引用这些文件的,需要采用绝对路径。这里有两种解决方案

  1. 把css中的内容全部copy到html文件中,然后统一copy到ftl模板文件中
  2. 通过在ftl文件中引用路径的位置定义标签,通过java代码的方式动态设置请求的绝对路径

我这里两种方式都采用了,css中的内容是全部copy到html文件中的,然后图片是路径是通过java代码动态设置的。

  • 这里把css copy到html中保存的时候可能会提示你字符集不匹配,需要把一些看不懂的字符,类似mso-style-name:³£¹æ;这种给删掉<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency>配置文件中配置springboot邮件发送支持配置
    image.png
  • 关于如何在java代码中动态设置图片的请求绝对路径可以采用如下方式,
    1. 先在模板中定义标签
      image.png
    1. 然后在java代码中获取项目的请求绝对路径,然后给这个标签赋值
      image.png
      相关实现代码pom.xml配置freemarker

发送类

public void send(Message message) {
    try {
        //建立邮件消息
        MimeMessage mainMessage = jms.createMimeMessage();
        //用MimeMessageHelper组装复杂邮件,第二个参数为true,可以发送附件
        MimeMessageHelper helper = new MimeMessageHelper(mainMessage, true);
        FhdTemplateDto fhdTemplateDto = (FhdTemplateDto) message.getContent();

        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        StringBuilder urlSb = new StringBuilder(request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/");
        if (!StringUtils.isEmpty(request.getContextPath())) {
            urlSb.append(request.getContextPath()).append("/");
        }
        urlSb.append("system/images/company_logo.png");
        fhdTemplateDto.setLogo("<img src=" + urlSb.toString() + " height="81" width="133">");

        Template template = freeMarkerConfigurationFactory.createConfiguration().getTemplate("emailTemplates/FhdMail.ftl");
        String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, fhdTemplateDto);
        helper.setFrom(mailusername);
        helper.setTo(message.getAddressee());
        helper.setSubject(message.getTitle());
        helper.setText(text, true);
        //添加附件
//            helper.addAttachment(message.getAttachmentFileName(), new File(message.getAttachmentFilePath()));
        jms.send(mainMessage);

        log.debug("发送成功");
    } catch (Exception e) {
        log.debug("发送失败", e);
    }
}

Message

@Data
public class Message {

    /**
     * 消息标题
     */
    private String title;

    /**
     * 收信人
     */
    private String addressee;

    /**
     * 内容
     */
    private Object content;

    /**
     * 附件名称
     */
    private String attachmentFileName;

    /**
     * 附件路径
     */
    private String attachmentFilePath;

}

模板文件(隐私问题不列出代码)

image.png

使用

image.png

参考:

https://blog.csdn.net/qq_40205116/article/details/83932316

https://blog.csdn.net/qq_31281189/article/details/97760951