java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot发送邮件

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

作者: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发送邮件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文