SpringBoot发送各种复杂格式邮件的示例详解

 更新时间:2024年11月19日 09:30:36   作者:morris131  
本文主要介绍了如何使用JavaMailSender接口和MimeMessageHelper类,在SpringBoot实现发送带有附件,嵌入资源,抄送和密送的复杂邮件,需要的可以了解下

在Spring Boot中发送带有附件、嵌入资源(如图片)、抄送(Cc)和密送(Bcc)的复杂邮件,你可以使用JavaMailSender接口和MimeMessageHelper类。

邮件格式

一封电子邮件主要由以下几个关键部分组成,这些部分共同构成了邮件的整体结构和内容:

1.收件人(To)

这是邮件发送到的电子邮箱地址。确保你输入的地址是正确的,以避免邮件发送错误或丢失。

2.抄送(Cc)(可选)

如果你希望其他人也能收到这封邮件,可以将他们的电子邮箱地址添加到抄送栏。抄送的人可以看到邮件的所有其他收件人。

3.密送(Bcc)(可选)

密送允许你将邮件发送给其他人,但这些人的邮箱地址不会显示在邮件的收件人或抄送列表中。这通常用于发送敏感信息,同时保护收件人的隐私。

4.主题(Subject)

邮件的主题是邮件内容的简短描述,应该准确反映邮件的要点或目的。一个清晰的主题有助于收件人快速了解邮件内容,并决定是否立即阅读。

5.正文(Body)

正文是邮件的主要内容,包括开头问候、具体信息或请求、行动要求以及结尾感谢等。正文应该清晰、简洁、有条理,避免使用过多的行业术语或复杂的句子结构。

6.附件(Attachments)(可选)

如果邮件中包含文件(如文档、图片、表格等),你可以将它们作为附件添加到邮件中。确保附件的大小不超过收件人邮箱的限制,并提醒收件人检查附件是否存在病毒或恶意软件。

7.签名(Signature)

邮件签名通常位于正文的底部,包括你的全名、职位(如果适用)、公司名称、联系方式(如电话、邮箱等)以及可能的公司logo或社交媒体链接。签名有助于建立你的专业形象,并方便收件人联系你。

8.发送时间(Sent Time)

这不是由你手动填写的部分,而是邮件系统自动记录的。它显示了邮件发送的确切时间,有助于收件人了解邮件的时效性。

9.优先级(Priority)(可选)

一些邮件系统允许你设置邮件的优先级(如高、中、低)。这有助于收件人根据邮件的重要性来安排阅读顺序。但请注意,不要滥用高优先级标记,以免降低其效果。

10.阅读回执(Read Receipt)(可选)

阅读回执是一种功能,当你发送邮件时,可以请求收件人在阅读邮件后发送一个确认回执。这有助于你了解邮件是否已被阅读,但请注意尊重收件人的隐私和意愿。

复杂邮件的发送

发送带抄送和密送的邮件

/**
 * 发送带抄送和密送的邮件
 *
 * @return "sendWithCcAndBcc"
 */
@GetMapping("/sendWithCcAndBcc")
public String sendWithCcAndBcc() {
    SimpleMailMessage message = new SimpleMailMessage();
    message.setTo("1508787838@qq.com");
    message.setCc("374785621@qq.com"); // 抄送
    message.setBcc("2426497890@qq.com"); // 密送
    message.setSubject("sendWithCcAndBcc");
    message.setText("sendWithCcAndBcc Text");
    message.setFrom("morris131@163.com");
    javaMailSender.send(message);
    return "sendWithCcAndBcc";
}

抄送的邮箱会显示在邮件的抄送列表,但是密送的邮箱不会显示在邮件的收件人或抄送列表。

发送带html格式的邮件

/**
 * 发送带html格式的邮件
 *
 * @return "sendWithHtml"
 */
@GetMapping("/sendWithHtml")
public String sendWithHtml() throws MessagingException {
    MimeMessage mimeMessage = javaMailSender.createMimeMessage();

    MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage);
    String htmlContent = "<html><body><h1>sendWithHtml test</h1></body></html>";
    // 邮件发送来源
    mimeMessageHelper.setFrom("morris131@163.com");
    // 邮件发送目标
    mimeMessageHelper.setTo("1508787838@qq.com");
    // 设置标题
    mimeMessageHelper.setSubject("sendWithHtml");
    // 设置内容,并设置内容 html 格式为 true
    mimeMessageHelper.setText(htmlContent, true);

    javaMailSender.send(mimeMessage);
    return "sendWithHtml";
}

mimeMessageHelper.setText(htmlContent, true);的第二个参数必须设置为true,才会把第一个参数的内容当成html处理,否则会当成普通文本处理。

注意:邮件html中不能写javascript内容,会被忽略。

发送带内嵌图片的html格式邮件

/**
 * 发送带内嵌图片的html格式邮件
 *
 * @return "sendWithInlineImageHtml"
 */
@GetMapping("/sendWithInlineImageHtml")
public String sendWithInlineImageHtml() throws MessagingException {
    MimeMessage mimeMessage = javaMailSender.createMimeMessage();

    String htmlContent = "<html><body>" +
            "<h1>欢迎来到 Spring boot 的世界</h1>" +
            "<image width='200' height='300' src='cid:java'>图片1 </image>" +//cid:是约定好的固定格式,只需要修改后面的变量
            "<image width='200' height='300' src='cid:springboot'>图片2 </image>" +
            "</body></html>";
    // 数组中的cid要和上面html中image中的cid一致,否则图片将设置失败
    Map<String, String> map = new HashMap<>();
    map.put("java", "images/java.png");
    map.put("springboot", "images/springboot.jpg");
    // multipart参数要设置为true,代表要支持附件
    MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, StandardCharsets.UTF_8.name());
    // 邮件发送来源
    mimeMessageHelper.setFrom("morris131@163.com");
    // 邮件发送目标
    mimeMessageHelper.setTo("1508787838@qq.com");
    // 设置标题
    mimeMessageHelper.setSubject("sendWithImageHtml");
    // 设置内容,并设置内容 html 格式为 true
    mimeMessageHelper.setText(htmlContent, true);

    // 设置 html 中内联的图片
    for (Map.Entry<String, String> entry : map.entrySet()) {
        // addInline() 方法 cid 需要 html 中的 cid (Content ID) 对应,才能设置图片成功,
        mimeMessageHelper.addInline(entry.getKey(), new ClassPathResource(entry.getValue()));
    }

    javaMailSender.send(mimeMessage);
    return "sendWithInlineImageHtml";
}

发送带有附件、内嵌资源时,需要将MimeMessageHelper构造方法的第二个参数设置为true,否则会抛出如下异常:

java.lang.IllegalStateException: Not in multipart mode - create an appropriate MimeMessageHelper via a constructor that takes a 'multipart' flag if you need to set alternative texts or add inline elements or attachments.
	at org.springframework.mail.javamail.MimeMessageHelper.getMimeMultipart(MimeMessageHelper.java:414) ~[spring-context-support-5.3.19.jar:5.3.19]

发送带附件的邮件

/**
 * 发送带附件的邮件
 *
 * @return "sendWithEnclosure"
 */
@GetMapping("/sendWithEnclosure")
public String sendWithEnclosure() throws MessagingException {

    Map<String, String> map = new HashMap<>();
    map.put("test1", "files/test1.txt");
    map.put("test2", "files/test2.7z");

    MimeMessage mimeMessage = javaMailSender.createMimeMessage();

    // multipart参数要设置为true,代表要支持附件
    MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, StandardCharsets.UTF_8.name());
    // 邮件发送来源
    mimeMessageHelper.setFrom("morris131@163.com");
    // 邮件发送目标
    mimeMessageHelper.setTo("1508787838@qq.com");
    // 设置标题
    mimeMessageHelper.setSubject("sendWithWithEnclosure");
    // 设置内容
    mimeMessageHelper.setText("sendWithWithEnclosure Text");

    // 添加附件
    for (Map.Entry<String, String> entry : map.entrySet()) {
        mimeMessageHelper.addAttachment(entry.getKey(), new ClassPathResource(entry.getValue()));
    }
    javaMailSender.send(mimeMessage);
    return "sendWithEnclosure";
}

发送Freemarker模板邮件

maven中引入包:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

gradle中引入:

implementation 'org.springframework.boot:spring-boot-starter-freemarker:2.6.7'
// org.springframework.web.servlet.view.freemarker;
@Resource
private FreeMarkerConfigurer freeMarkerConfigurer;

/**
 * 发送Freemarker模板邮件
 *
 * @return "sendWithFreemarker"
 */
@GetMapping("/sendWithFreemarker")
public String sendWithFreemarker() throws MessagingException, IOException, TemplateException {
    MimeMessage mimeMessage = javaMailSender.createMimeMessage();
    MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
    // 邮件发送来源
    messageHelper.setFrom("morris131@163.com");
    // 邮件发送目标
    messageHelper.setTo("1508787838@qq.com");
    // 设置邮件主题
    messageHelper.setSubject("sendWithFreemarker");
    // 获取模板
    Template template = freeMarkerConfigurer.getConfiguration().getTemplate("email.ftl", "UTF-8");

    HashMap<String, Object> map = new HashMap<>();
    map.put("userName", "Morris131");
    map.put("age", 18);

    // 填充数据并把模板转为字符串
    String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);
    // 设置邮件内容,第二个参数为true表示将发送内容设置为"text/html"
    messageHelper.setText(content, true);

    javaMailSender.send(mimeMessage);

    return "sendWithFreemarker";
}

html模板的位置:默认在resource/templates/目录下,模板文件名为email.ftl

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Hello Email</title>
</head>
<body>
<p>用户:${userName}</p>
<p>年龄:${age}</p>
</body>
</html>

到此这篇关于SpringBoot发送各种复杂格式邮件的示例详解的文章就介绍到这了,更多相关SpringBoot发送邮件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java自定义类加载器如何实现类隔离

    java自定义类加载器如何实现类隔离

    这篇文章主要介绍了java自定义类加载器如何实现类隔离问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Spring Cloud Hystrix原理与注意事项小结

    Spring Cloud Hystrix原理与注意事项小结

    本文介绍了Hystrix的基本概念、工作原理以及其在实际开发中的应用方式,通过对Hystrix的深入学习,开发者可以在分布式系统中实现精细的错误处理机制,并能够及时响应系统中的异常,避免服务的连锁崩溃,感兴趣的朋友一起看看吧
    2025-03-03
  • MyBatis通过BATCH批量提交的方法

    MyBatis通过BATCH批量提交的方法

    今天小编就为大家分享一篇关于MyBatis通过BATCH批量提交的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • maven下载依赖失败问题及解决

    maven下载依赖失败问题及解决

    这篇文章主要介绍了maven下载依赖失败问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • J2SE 1.5版本的新特性一览

    J2SE 1.5版本的新特性一览

    J2SE 1.5版本的新特性一览...
    2006-12-12
  • Spring AOP源码深入分析

    Spring AOP源码深入分析

    这篇文章主要介绍了Spring AOP源码,AOP(Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充
    2023-01-01
  • 深入了解Spring中Bean的作用域和生命周期

    深入了解Spring中Bean的作用域和生命周期

    这篇文章主要介绍了深入了解Spring中Bean的作用域和生命周期,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 一文带你学会规则引擎Drools的应用

    一文带你学会规则引擎Drools的应用

    Drools 就是一个开源的业务规则引擎,可以很容易地与 spring boot 应用程序集成,这篇文章就来和大家详细聊聊Drools的具体应用,需要的可以参考一下
    2023-03-03
  • Spring源码完美导入IDEA的过程

    Spring源码完美导入IDEA的过程

    正值春节假期,小伙伴私信我idea导入spring源码的过程,今天抽空给大家整理一篇教程帮助大家学习Spring源码完美导入IDEA的详细过程,感兴趣的朋友一起看看吧
    2022-02-02
  • springboot如何查找配置文件路径的顺序和其优先级别

    springboot如何查找配置文件路径的顺序和其优先级别

    此文是在工作中遇到的关于springboot配置文件的问题,在网上查阅资料和自己测试之后记录的,以便日后查阅。希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08

最新评论