自学内容网 自学内容网

【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>


原文地址:https://blog.csdn.net/u022812849/article/details/143855890

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!