当前位置: 首页 > article >正文

【SpringBoot】发送各种复杂格式的邮件

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

邮件格式

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

收件人(To)

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

抄送(Cc)(可选)

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

密送(Bcc)(可选)

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

主题(Subject)

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

正文(Body)

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

附件(Attachments)(可选)

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

签名(Signature)

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

发送时间(Sent Time)

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

优先级(Priority)(可选)

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

阅读回执(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>


http://www.kler.cn/a/405430.html

相关文章:

  • JAVA八股与代码实践----JDK代理和CGLIB代理的区别
  • Spring Boot核心概念:日志管理
  • 美畅物联丨智能分析,安全管控:视频汇聚平台助力智慧工地建设
  • SAP B1 登陆报错解决方案 - 系统架构目录服务器选择
  • Unity3d场景童话梦幻卡通Q版城镇建筑植物山石3D模型游戏美术素材
  • 「Mac玩转仓颉内测版26」基础篇6 - 字符类型详解
  • Centos 8, add repo
  • .net 8使用hangfire实现库存同步任务
  • 分布式锁RedissonClient应用
  • 某车企ASW面试笔试题
  • Linux tcpdump 详解教程
  • 海盗王集成网关和商城服务端功能golang版
  • 重构代码之引入本地扩展
  • 【IOS】编译缓存错误Library/Caches/com.apple.mobile.installd.staging
  • 直流电表精准计量,为光伏产业续航
  • 2025蓝桥杯(单片机)备赛--扩展外设之UART1的原理与应用(十二)
  • 分治法的魅力:高效解决复杂问题的利器
  • 什么是axios?怎么使用axios封装Ajax?
  • 第1章 初识SpringMVC
  • 【滑动窗口】至少有k个重复字符的最长子串
  • 系统思考—跳出症状看全局
  • 【linux013】文件操作命令篇 - less 命令
  • python使用 `importlib.resources` 管理资源文件
  • FPC柔性线路板与智能生活的融合
  • 【电路笔记 TMS320F28335DSP】时钟+看门狗+相关寄存器(功能模块使能、时钟频率配置、看门狗配置)
  • Spark RDD(弹性分布式数据集)的深度理解