springboot整合邮箱功能二(普通邮件, html邮件, thymleaf邮件)

news2024/11/18 7:25:50

【SpringBoot整合Email发送邮件】_ζั͡ ั͡空 ั͡ ั͡白�的博客-CSDN博客

https://www.cnblogs.com/erlou96/p/16878192.html#_label1_5

1. 准备工作

1.1 qq邮箱设置

  • 本文默认使用qq邮箱来发送邮件,然后使用一个在线临时邮箱来接收邮件。
  • 为了让程序能够通过qq邮箱来发送邮件,必须在qq邮箱中配置一下打开IMAP/SMTP服务

在这里插入图片描述

开启的时候,需要通过手机发送一条信息作为验证,验证成功后,会给你一个授权码,这个后面我们要用到

在这里插入图片描述

在这里插入图片描述

2. SpringBoot项目配置

2.1 springboot项目中引入email依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <!--<version>2.7.11</version>-->
        <version>2.5.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <project-name>spring-boot-email</project-name>

        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <groupId>org.example</groupId>
    <artifactId>${project-name}</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>${project-name}</name>
    <description>${project-name}</description>

    <dependencies>
        <!--发送邮件的依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

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

        <!--web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- ================= 应用 ================== -->
        <!-- thymeleaf模板 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.25</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>31.1-android</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.7.1</version>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2.2 application.yml配置信息

server:
  port: 8000
  max-http-header-size: 8192
  servlet:
    encoding:
      charset: UTF-8
      force: true
      enabled: true

#配置日志
logging:
  level:
    root: info
spring:
  application:
    name: spring-boot-email
  mvc.async.request-timeout: 20000

  mail:
    #    host: "smtp.163.com" # 发件服务器地址
    #    port: 25 # 常用邮件端口25、109、110、143、465、995、993、994 如果开启了SSL安全则使用对应的端口号,25为非加密端口号
    #    username: admin@163.com # 发送邮件的账号
    #    password: 123456 # 配置密码,注意,不是真正的密码,而是刚刚申请到的授权码
    #    default-encoding: utf-8 # 设置编码
    host: smtp.exmail.qq.com
    port: 465
    username: test@xxx.cn
    password: 123123
    default-encoding: utf-8 # 设置编码
    protocol: smtp
    properties: # 设置邮件超时时间防止服务器阻塞
      timeout: 5000
      connection-timeout: 5000
      write-timeout: 5000
      mail:
        debug: true # 表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
        # 官方建议使用 465 端口,而 465 端口是 SSL 协议的,所以不仅要换端口,
        # 还需要进行 SSL 协议替换。下面是在 application.properties 进行的邮件发送相关配置,
        smtp:
          socketFactory:
            port: 465
          #socketFactoryClass: javax.net.ssl.SSLSocketFactory #配饰 SSL 加密工厂
          ssl:
            enable: true
  thymeleaf:
    cache: false
    mode: LEGACYHTML5 # 类型
    prefix: classpath:/templates/ # 模板存放的位置
    suffix: .html # 模板的后缀

2.3  创建EmailModel

用于封装邮件中需要包含的信息

package org.example.entity;

import java.io.Serializable;
import java.util.Map;

/**
 * @author test 2023-05-08 10:52:59
 */
public class EmailModel implements Serializable {
    /**
     * 收件人邮箱
     */
    private String[] recipientMailbox;

    /**
     * 邮件正文内容
     */
    private String content;

    /**
     * 邮件主题
     */
    private String title;

    /**
     * 抄送人邮箱
     */
    private String[] ccMailbox;

    /**
     * 加密抄送人邮箱
     */
    private String[] bccMailbox;

    /**
     * 真实名称/附件路径
     * enclosures: {“fileNmae”: "filePath+fileNmae"}
     */
    private Map<String, Object> enclosures;

    //    附件是否添加的到正文,默认false不添加
    //    private Boolean is_;


    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String[] getRecipientMailbox() {
        return recipientMailbox;
    }

    public void setRecipientMailbox(String[] recipientMailbox) {
        this.recipientMailbox = recipientMailbox;
    }

    public String[] getCcMailbox() {
        return ccMailbox;
    }

    public void setCcMailbox(String[] ccMailbox) {
        this.ccMailbox = ccMailbox;
    }

    public String[] getBccMailbox() {
        return bccMailbox;
    }

    public void setBccMailbox(String[] bccMailbox) {
        this.bccMailbox = bccMailbox;
    }

    public Map<String, Object> getEnclosures() {
        return enclosures;
    }

    public void setEnclosures(Map<String, Object> enclosures) {
        this.enclosures = enclosures;
    }
}

2.4 创建EmailService

package org.example.service;

import org.apache.commons.lang3.ArrayUtils;
import org.example.entity.EmailModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.Date;
import java.util.Map;

/**
 * @author Administrator
 */
@Service
@EnableAsync
public class EmailService {
    Logger log = LoggerFactory.getLogger(getClass());

    /**
     * 将配置文件中的username注入到MAIL_USERNAME中, 这是发送人的邮箱地址
     */
    @Value("${spring.mail.username}")
    public String MAIL_USERNAME;

    /**
     * JavaMailSender类的对象, 是springboot自动装配的
     */
    @Resource
    private JavaMailSender javaMailSender;

    /**
     * template 模板引擎
     */
    @Autowired
    private TemplateEngine templateEngine;

    /**
     * 发送简单的邮件(内容为纯文本邮件)
     * @param model
     * @return
     */
    public boolean sendSimpleEmail(EmailModel model) {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();

        // 设置发件人邮箱
        simpleMailMessage.setFrom(MAIL_USERNAME);

        // 设置接收人账号
        simpleMailMessage.setTo(model.getRecipientMailbox());

        // 设置邮件标题
        simpleMailMessage.setSubject(model.getTitle());

        // 设置抄送人
        String[] ccMailbox = model.getCcMailbox();
        if (ArrayUtils.isNotEmpty(ccMailbox)) { // org.apache.commons.lang3.ArrayUtils
            simpleMailMessage.setCc(model.getCcMailbox());
        }

        // 加密抄送人邮箱
        String[] bccMailbox = model.getBccMailbox();
        if (ArrayUtils.isNotEmpty(bccMailbox)) {
            simpleMailMessage.setBcc(model.getBccMailbox()); // 加密抄送
        }

        // 发送日期
        simpleMailMessage.setSentDate(new Date());

        // 设置邮件正文内容
        simpleMailMessage.setText(model.getContent());

        // 发送邮件
        javaMailSender.send(simpleMailMessage);
        log.info("send simple email success!");
        return true;
    }

    /**
     * 发送富文本邮件(附件,图片,html等)
     *      使用MimeMessage来作为对象发送,
     *      但是邮件内容需要通过 MimeMessageHelper 对象来进行封装进MimeMessage 里
     * 注意:
     *      如果发送的内容包括html标签, 则需要 helper.setText(email.getContent(),true);
     *      第二个参数要为true,表示开启识别html标签.默认是false,也就是不识别.
     * @param model
     * @return
     */
    public boolean sendMimeEmail(EmailModel model) {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);

        try {
            // 设置发件人邮箱
            helper.setFrom(MAIL_USERNAME);

            // 设置接收人账号
            helper.setTo(model.getRecipientMailbox());

            // 设置邮件标题
            helper.setSubject(model.getTitle());

            // 设置抄送人
            String[] ccMailbox = model.getCcMailbox();
            if (ArrayUtils.isNotEmpty(ccMailbox)) { // org.apache.commons.lang3.ArrayUtils
                helper.setCc(model.getCcMailbox());
            }

            // 加密抄送人邮箱
            String[] bccMailbox = model.getBccMailbox();
            if (ArrayUtils.isNotEmpty(bccMailbox)) {
                helper.setBcc(model.getBccMailbox()); // 加密抄送
            }

            // 发送日期
            helper.setSentDate(new Date());

            // 发送的内容包括html标签, 需要 helper.setText(email.getContent(),true); 开启html识别
            // 使用 MimeMessage 对象, 调用setText方法, 里面的字符串是带有html标签的字符串,
            // 在发送邮件的时候会自动解析正文中的html标签
            helper.setText(model.getContent(), true);

            // 发送邮件
            javaMailSender.send(mimeMessage);
            log.info("send mime email success!");
            return true;
        } catch (MessagingException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 使用 MimeMessage 发送富文本邮件(附件,图片,html等)
     * @param model
     * @return
     */
    public boolean sendAttachMimeEmail(EmailModel model) {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();

        try {
            // 发送带附件的邮件, 需要加一个参数为true
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);

            // 设置发件人邮箱
            helper.setFrom(MAIL_USERNAME);

            // 设置接收人账号
            helper.setTo(model.getRecipientMailbox());

            // 设置邮件标题
            helper.setSubject(model.getTitle());

            // 设置抄送人
            String[] ccMailbox = model.getCcMailbox();
            if (ArrayUtils.isNotEmpty(ccMailbox)) { // org.apache.commons.lang3.ArrayUtils
                helper.setCc(model.getCcMailbox());
            }

            // 加密抄送人邮箱
            String[] bccMailbox = model.getBccMailbox();
            if (ArrayUtils.isNotEmpty(bccMailbox)) {
                helper.setBcc(model.getBccMailbox()); // 加密抄送
            }

            // 发送日期
            helper.setSentDate(new Date());

            // 发送的内容包括html标签, 需要 helper.setText(email.getContent(),true); 开启html识别
            // 使用 MimeMessage 对象, 调用setText方法, 里面的字符串是带有html标签的字符串,
            // 在发送邮件的时候会自动解析正文中的html标签
            helper.setText(model.getContent(), true);

            Map<String, Object> enclosures = model.getEnclosures();

            // 创建要传递的附件对象
            if (!CollectionUtils.isEmpty(enclosures)) { // import org.springframework.util.CollectionUtils;
                for (String key : enclosures.keySet()) {
                    // File file = new File("D:\mybatis.doc");
                    File file = new File((String) enclosures.get(key));

                    // 通过MimeMessageHelper对象的addAttachment方法来传递附件
                    // 第一个参数为附件名, 第二个参数为File对象
                    helper.addAttachment(key, file);
                }
            }

            // 预览文件
            // helper.addAttachment("2.jpg", new File("E:\\pic\\2.jpg"));
            // 配合前端可以直接预览图片
            // helper.addInline("p01", new FileSystemResource(new File("E:\\pic\\2.jpg")));
            // helper.addInline("p02", new FileSystemResource(new File("E:\\pic\\2.jpg")));

            // 发送邮件
            javaMailSender.send(mimeMessage);
            log.info("send mime email success!");
            return true;
        } catch (MessagingException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 发送模板邮件 使用 thymeleaf 模板
     *   如果使用freemarker模板
     *       Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
     *       configuration.setClassForTemplateLoading(this.getClass(), "/templates");
     *       String emailContent = FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate("mail.ftl"), params);
     * @param model
     * @return
     */
    public boolean sendTemplateMail(EmailModel model) {
        // 发一个复杂一点的邮件
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();

        try {
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);

            // 设置发件人邮箱
            helper.setFrom(MAIL_USERNAME);

            // 设置接收人账号
            helper.setTo(model.getRecipientMailbox());

            // 设置邮件标题
            helper.setSubject(model.getTitle());

            // 设置抄送人
            String[] ccMailbox = model.getCcMailbox();
            if (ArrayUtils.isNotEmpty(ccMailbox)) { // org.apache.commons.lang3.ArrayUtils
                helper.setCc(model.getCcMailbox());
            }

            // 加密抄送人邮箱
            String[] bccMailbox = model.getBccMailbox();
            if (ArrayUtils.isNotEmpty(bccMailbox)) {
                helper.setBcc(model.getBccMailbox()); // 加密抄送
            }

            // 发送日期
            helper.setSentDate(new Date());

            // 使用模板thymeleaf
            // Context 是导这个包import org.thymeleaf.context.Context;
            Context context = new Context();
            // 定义模板数据
            context.setVariables(model.getEnclosures());
            // 获取thymeleaf的html模板, 指定模板路径
            // 在 Spring Boot 中, 模板引擎的默认配置已经将模板文件的根路径设置为 /src/main/resources/templates
            String emailContent = templateEngine.process("index.html", context);

            // 发送的内容包括html标签, 需要 helper.setText(email.getContent(),true); 开启html识别
            // 使用 MimeMessage 对象, 调用setText方法, 里面的字符串是带有html标签的字符串,
            // 发送邮件的时候会自动解析正文中的html标签
            helper.setText(emailContent, true);

            Map<String, Object> enclosures = model.getEnclosures();

            // 创建要传递的附件对象
            // import org.springframework.util.CollectionUtils;
            if (!CollectionUtils.isEmpty(enclosures)) {
                for (String key : enclosures.keySet()) {
                    // File file = new File(“D:\mybatis.doc”);
                    File file = new File((String)enclosures.get(key));
                    // 通过MimeMessageHelper对象的addAttachment方法来传递附件, 第一个参数为附件名, 第二个参数为FIle对象
                    helper.addAttachment(key, file);
                }
            }

            // 发送邮件
            javaMailSender.send(mimeMessage);
            log.info("send mime email success!");
            return true;
        } catch (MessagingException e) {
            e.printStackTrace();
            return false;
        }
    }
}

2.5 创建EmailController 

package org.example.controller;

import org.example.entity.EmailModel;
import org.example.service.EmailService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.mail.MessagingException;

/**
 * 通知告警服务:
 *      集成 drools:
 *
 *      通知渠道: 站内信, 邮件, 短信, 微信 等等
 *      通知策略: 告警级别设置, 告警规则合并, 告警通知的周期。。 粒度
 *          交易通知:
 *              告警级别
 *              通知策略:
 *                  drools
 *          告警规则:mysql+springboot 交易服务 放在 同一台机器 --》 几百条 合并为一条
 *      权限,认证
 * @description:
 */
@RestController
public class EmailController {
    Logger log = LoggerFactory.getLogger(getClass());

    @Autowired
    EmailService emailService;

    @RequestMapping("test")
    public String test() {
        log.info("ok");
        return "ok";
    }

    /**
     * {
     *     "recipientMailbox": [
     *         "test@xxx.cn"
     *     ],
     *     "title": "简单测试主题",
     *     "content": "测试邮件测试人test"
     * }
     * @param model
     * @return
     * @throws MessagingException
     */
    @RequestMapping("sendSimpleEmail")
    public String sendSimpleEmail(@RequestBody EmailModel model) {
        emailService.sendSimpleEmail(model);
        return "success!";
    }

    /**
     * {
     *     "recipientMailbox": [
     *         "test@xxx.cn"
     *     ],
     *     "title": "html测试主题",
     *     "content": "<h1>测试邮件测试人test</h1>
     *        <a href=\"https://www.baidu.com/\">点击跳转百度</a>
     *        <img src=\"https://img-blog.csdnimg.cn/2092623a09ed4d19ac4b9ab5301462cf.png\"></img>"
     * }
     * @param model
     * @return
     * @throws MessagingException
     */
    @RequestMapping("sendMimeEmail")
    public String sendMimeEmail(@RequestBody EmailModel model) {
        emailService.sendMimeEmail(model);
        return "success!";
    }

    /**
     * {
     *     "recipientMailbox": [
     *         "test@xxx.cn"
     *     ],
     *     "title": "附件测试主题",
     *     "content": "<img src=\"https://img-blog.csdnimg.cn/2092623a09ed4d19ac4b9ab5301462cf.png\"></img>",
     *     "enclosures": {
     *         "dog2.jpg": "E:\\img\\dog2.png"
     *     }
     * }
     * @param model
     * @return
     */
    @RequestMapping("sendAttachMimeEmail")
    public String sendAttachMimeEmail(@RequestBody EmailModel model) {
        emailService.sendAttachMimeEmail(model);
        return "success!";
    }

    /**
     * {
     *     "recipientMailbox": [
     *         "test@xxx.cn"
     *     ],
     *     "title": "thymeleaf 测试主题",
     *     "enclosures": {
     *         "dog2.jpg": "E:\\img\\dog2.png"
     *     }
     * }
     * @param model
     * @return
     */
    @RequestMapping("sendTemplateMail")
    @ResponseBody
    public String sendTemplateMail(@RequestBody EmailModel model) {
        emailService.sendTemplateMail(model);
        return "success!";
    }
}

3. 邮件发送类型讲解

下文中所有的实现都是写在 EmailService 类中。

3.1 发送简单的邮件(内容为纯文本邮件)

通过SimpleMailMessage对象来发送简单邮件,邮件的内容只能是纯文本,将内容封装到该对象中,再通过javaMailSender对象来发送邮件

/**
 * 发送简单的邮件(内容为纯文本邮件)
 * @param model
 * @return
 */
public boolean sendSimpleEmail(EmailModel model) {
	SimpleMailMessage simpleMailMessage = new SimpleMailMessage();

	// 设置发件人邮箱
	simpleMailMessage.setFrom(MAIL_USERNAME);

	// 设置接收人账号
	simpleMailMessage.setTo(model.getRecipientMailbox());

	// 设置邮件标题
	simpleMailMessage.setSubject(model.getTitle());

	// 设置抄送人
	String[] ccMailbox = model.getCcMailbox();
	if (ArrayUtils.isNotEmpty(ccMailbox)) { // org.apache.commons.lang3.ArrayUtils
		simpleMailMessage.setCc(model.getCcMailbox());
	}

	// 加密抄送人邮箱
	String[] bccMailbox = model.getBccMailbox();
	if (ArrayUtils.isNotEmpty(bccMailbox)) {
		simpleMailMessage.setBcc(model.getBccMailbox()); // 加密抄送
	}

	// 发送日期
	simpleMailMessage.setSentDate(new Date());

	// 设置邮件正文内容
	simpleMailMessage.setText(model.getContent());

	// 发送邮件
	javaMailSender.send(simpleMailMessage);
	log.info("send simple email success!");
	return true;
}

3.1.2 postman脚本 

{
    "recipientMailbox": [
        "test@xxxx.cn"
    ],
    "title": "简单测试主题",
    "content": "<h1>测试邮件测试人test</h1>"
}

3.1.3 发送请求,将email对象中的数据初始化

在这里插入图片描述

查看是否收到邮件,内容和我们发送的一样

在这里插入图片描述

3.2 发送简单的邮件(内容可以识别html标签)

3.2.1 方法1

  • 直接和上面一样,使用SimpleMessage对象,调用setText方法,里面的字符串是带有html标签的字符串,在发送邮件的时候会自动解析正文中的html标签
  • 代码和上面一样,只需要修改发送email的内容即可

在这里插入图片描述

在这里插入图片描述

3.2.2 方法2

使用MimeMessage来作为对象发送,但是邮件内容需要通过MimeMessageHelper对象来进行封装进MimeMessage里

注意:

如果发送的内容包括html标签,则需要 helper.setText(email.getContent(),true);第二个参数要为true,表示开启识别html标签.默认是false,也就是不识别.

在这里插入图片描述

/**
 * 发送富文本邮件(附件,图片,html等)
 *      使用MimeMessage来作为对象发送,
 *      但是邮件内容需要通过 MimeMessageHelper 对象来进行封装进MimeMessage 里
 * 注意:
 *      如果发送的内容包括html标签, 则需要 helper.setText(email.getContent(),true);
 *      第二个参数要为true,表示开启识别html标签.默认是false,也就是不识别.
 * @param model
 * @return
 */
public boolean sendMimeEmail(EmailModel model) {
	MimeMessage mimeMessage = javaMailSender.createMimeMessage();
	MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);

	try {
		// 设置发件人邮箱
		helper.setFrom(MAIL_USERNAME);

		// 设置接收人账号
		helper.setTo(model.getRecipientMailbox());

		// 设置邮件标题
		helper.setSubject(model.getTitle());

		// 设置抄送人
		String[] ccMailbox = model.getCcMailbox();
		if (ArrayUtils.isNotEmpty(ccMailbox)) { // org.apache.commons.lang3.ArrayUtils
			helper.setCc(model.getCcMailbox());
		}

		// 加密抄送人邮箱
		String[] bccMailbox = model.getBccMailbox();
		if (ArrayUtils.isNotEmpty(bccMailbox)) {
			helper.setBcc(model.getBccMailbox()); // 加密抄送
		}

		// 发送日期
		helper.setSentDate(new Date());

		// 发送的内容包括html标签, 需要 helper.setText(email.getContent(),true); 开启html识别
		// 使用 MimeMessage 对象, 调用setText方法, 里面的字符串是带有html标签的字符串,
		// 在发送邮件的时候会自动解析正文中的html标签
		helper.setText(model.getContent(), true);

		// 发送邮件
		javaMailSender.send(mimeMessage);
		log.info("send mime email success!");
		return true;
	} catch (MessagingException e) {
		e.printStackTrace();
		return false;
	}
}

3.2.3 postman脚本

{
    "recipientMailbox": [
        "test@xxxx.cn"
    ],
    "title": "链接地址测试主题",
    "content": "<a href=\"https://www.baidu.com/\">点击跳转百度</a>"
}

在这里插入图片描述

在这里插入图片描述

3.3 发送带静态资源(图片)的邮件中

方法和上面方法2中的代码是一致的,只相当于邮件内容还是html标签,现在就是使用的<img>标签

在这里插入图片描述

3.3.1 postman脚本 

{
    "recipientMailbox": [
        "test@xxxx.cn"
    ],
    "title": "图片测试主题",
    "content": "<img src=\"https://img-blog.csdnimg.cn/2092623a09ed4d19ac4b9ab5301462cf.png\"></img>"
}

效果图:

在这里插入图片描述

3.4 发送带附件的邮件

  • 我们的邮件中可能还需要附带一些附件,比如文件,或者jar包等等,如何发送附件呢?
  • 也是使用MimeMessage对象和MimeMessageHelper对象,但是在创建MimeMessageHelper对象的时候需要加一个参数为true.

在这里插入图片描述

/**
 * 使用 MimeMessage 发送富文本邮件(附件,图片,html等)
 * @param model
 * @return
 */
public boolean sendAttachMimeEmail(EmailModel model) {
	MimeMessage mimeMessage = javaMailSender.createMimeMessage();

	try {
		// 发送带附件的邮件, 需要加一个参数为true
		MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);

		// 设置发件人邮箱
		helper.setFrom(MAIL_USERNAME);

		// 设置接收人账号
		helper.setTo(model.getRecipientMailbox());

		// 设置邮件标题
		helper.setSubject(model.getTitle());

		// 设置抄送人
		String[] ccMailbox = model.getCcMailbox();
		if (ArrayUtils.isNotEmpty(ccMailbox)) { // org.apache.commons.lang3.ArrayUtils
			helper.setCc(model.getCcMailbox());
		}

		// 加密抄送人邮箱
		String[] bccMailbox = model.getBccMailbox();
		if (ArrayUtils.isNotEmpty(bccMailbox)) {
			helper.setBcc(model.getBccMailbox()); // 加密抄送
		}

		// 发送日期
		helper.setSentDate(new Date());

		// 发送的内容包括html标签, 需要 helper.setText(email.getContent(),true); 开启html识别
		// 使用 MimeMessage 对象, 调用setText方法, 里面的字符串是带有html标签的字符串,
		// 在发送邮件的时候会自动解析正文中的html标签
		helper.setText(model.getContent(), true);

		Map<String, Object> enclosures = model.getEnclosures();

		// 创建要传递的附件对象
		if (!CollectionUtils.isEmpty(enclosures)) { // import org.springframework.util.CollectionUtils;
			for (String key : enclosures.keySet()) {
				// File file = new File("D:\mybatis.doc");
				File file = new File((String) enclosures.get(key));

				// 通过MimeMessageHelper对象的addAttachment方法来传递附件
				// 第一个参数为附件名, 第二个参数为File对象
				helper.addAttachment(key, file);
			}
		}

		// 预览文件
		// helper.addAttachment("2.jpg", new File("E:\\pic\\2.jpg"));
		// 配合前端可以直接预览图片
		// helper.addInline("p01", new FileSystemResource(new File("E:\\pic\\2.jpg")));
		// helper.addInline("p02", new FileSystemResource(new File("E:\\pic\\2.jpg")));

		// 发送邮件
		javaMailSender.send(mimeMessage);
		log.info("send mime email success!");
		return true;
	} catch (MessagingException e) {
		e.printStackTrace();
		return false;
	}
}

3.4.1 postman脚本 

{
    "recipientMailbox": [
        "test@xxx.cn"
    ],
    "title": "附件测试主题",
    "content": "<img src=\"https://img-blog.csdnimg.cn/2092623a09ed4d19ac4b9ab5301462cf.png\"></img>",
    "enclosures": {
        "dog2.jpg": "E:\\2.新员工\\img\\dog2.png"
    }
}

3.4.2 重点

  1. 第二个参数为true 
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
File file = new File(“D:\Users\Administrator\Desktop\picture\mybatis.doc”);
  1. 调用helper的addAttachment来添加附件
helper.addAttachment(file.getName(),file);

在这里插入图片描述

3.4.3 附件上传成功!

在这里插入图片描述

3.5 发送 thymleaf 模板邮件 

3.5.1 模板 mail.html

放在resource/templates/mail目录下

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>title</title>
</head>
<body>
    <h3>你看我<span style="font-size: 35px" th:text="${username}"></span>, 哈哈哈!</h3>
</body>
</html>

3.5.2 postman脚本 

{
    "recipientMailbox": [
        "langpf@houputech.cn"
    ],
    "title": "thymeleaf 测试主题",
    "enclosures": {
        "dog2.jpg": "E:\\2.新员工\\img\\dog2.png"
    }
}
/**
 * 发送模板邮件 使用 thymeleaf 模板
 *   如果使用freemarker模板
 *       Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
 *       configuration.setClassForTemplateLoading(this.getClass(), "/templates");
 *       String emailContent = FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate("mail.ftl"), params);
 * @param model
 * @return
 */
public boolean sendTemplateMail(EmailModel model) {
	// 发一个复杂一点的邮件
	MimeMessage mimeMessage = javaMailSender.createMimeMessage();

	try {
		MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);

		// 设置发件人邮箱
		helper.setFrom(MAIL_USERNAME);

		// 设置接收人账号
		helper.setTo(model.getRecipientMailbox());

		// 设置邮件标题
		helper.setSubject(model.getTitle());

		// 设置抄送人
		String[] ccMailbox = model.getCcMailbox();
		if (ArrayUtils.isNotEmpty(ccMailbox)) { // org.apache.commons.lang3.ArrayUtils
			helper.setCc(model.getCcMailbox());
		}

		// 加密抄送人邮箱
		String[] bccMailbox = model.getBccMailbox();
		if (ArrayUtils.isNotEmpty(bccMailbox)) {
			helper.setBcc(model.getBccMailbox()); // 加密抄送
		}

		// 发送日期
		helper.setSentDate(new Date());

		// 使用模板thymeleaf
		// Context 是导这个包import org.thymeleaf.context.Context;
		Context context = new Context();
		// 定义模板数据
		context.setVariables(model.getEnclosures());
		// 获取thymeleaf的html模板, 指定模板路径
		// 在 Spring Boot 中, 模板引擎的默认配置已经将模板文件的根路径设置为 /src/main/resources/templates
		String emailContent = templateEngine.process("index.html", context);

		// 发送的内容包括html标签, 需要 helper.setText(email.getContent(),true); 开启html识别
		// 使用 MimeMessage 对象, 调用setText方法, 里面的字符串是带有html标签的字符串,
		// 发送邮件的时候会自动解析正文中的html标签
		helper.setText(emailContent, true);

		Map<String, Object> enclosures = model.getEnclosures();

		// 创建要传递的附件对象
		// import org.springframework.util.CollectionUtils;
		if (!CollectionUtils.isEmpty(enclosures)) {
			for (String key : enclosures.keySet()) {
				// File file = new File(“D:\mybatis.doc”);
				File file = new File((String)enclosures.get(key));
				// 通过MimeMessageHelper对象的addAttachment方法来传递附件, 第一个参数为附件名, 第二个参数为FIle对象
				helper.addAttachment(key, file);
			}
		}

		// 发送邮件
		javaMailSender.send(mimeMessage);
		log.info("send mime email success!");
		return true;
	} catch (MessagingException e) {
		e.printStackTrace();
		return false;
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/517488.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

srs one2one,one2many通话环境搭建

一、简介 二、go环境配置 三、srs编译配置 四、信令服务器编译 4.1 signaling8 4.2 web服务器 五、测试 六、附录 官⽅⽂档参考地址&#xff1a;https://github.com/ossrs/srs/wiki/v4_CN_WebRTC#sfu-one-to-one 一、简介 srs的webrtc能力和两个信令服务器不管是逻辑上还是代码…

Linux 进程基础

目录 1、进程的概念 2、进程与线程的区别、进程与程序的区别 2.1 进程与线程的区别 2.2 进程与程序的区别 3、进程相关 shell 命令 3.1 ps 3.3.1 参数说明 3.3.2 结果说明 3.2 pidof 3.3 pstree 3.4 top 3.5 kill 4、进程相关函数 4.1 fork 4.1.1 fork的函数原型…

医院内导航及智能导医,医院导诊图怎么制作?

在大型综合性医院&#xff0c;由于专业分工精细&#xff0c;一个诊疗过程涉及的功能单元往往分布在不同的楼宇、不同楼层的不同位置&#xff0c;再加上多数患者对医院环境不熟悉&#xff0c;导致滞院的时间长、诊疗效率低、患者对服务的满意度下降。为解决这一问题&#xff0c;…

VMware Aria Operations for Logs 8.12 - 集中式日志管理

VMware Aria Operations for Logs 8.12 - 集中式日志管理 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-aria-operations-for-logs/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 集中式日志管理 VMware Aria …

蓝牙mesh数据包格式解析

蓝牙mesh数据包的结构如下图&#xff1a; 总长31个字节。 Length (1Byte)&#xff1a;数据长度 Type (1Byte)&#xff1a;广播类型 IVI (1bit)&#xff1a;用来认证加密Network PDU的IV index的最低位 NID (7bits)&#xff1a;网络ID&#xff0c;network ID。从网络密钥(Ne…

学习了两个多月就进了我们公司,顺利过了试用期,我心塞了...

转行起因 公司前段时间来了个大专机械专业毕业的&#xff0c;挺好奇他在如今这个环境下怎么进来的而且非本科非科班&#xff0c;后面我请他喝了一次酒&#xff0c;我才了解到他的故事&#xff0c;写出来与大家分享&#xff0c;希望对各位有点启迪。 他以前在一个大厂做售后工…

新来的00后真卷,我想离职了···

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。 这不&#xff0c;前段时间我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪20K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。…

sentinel基本原理以及核心类介绍

Sentinel 核心类解析 架构图 ProcessorSlotChain Sentinel 的核心骨架&#xff0c;如上图结构&#xff0c;将不同的 Slot 按照顺序串在一起&#xff08;责任链模式&#xff09;&#xff0c;从而将不同的功能&#xff08;限流、降级、系统保护&#xff09;组合在一起。slot ch…

2023.05.11-利用GPT4free免费使用ChatGPT4

1. 简介 现在OpenAI&#xff0c;虽然出了ChatGPT4&#xff0c;但是只给plus会员用&#xff0c;对于国内的用户来说&#xff0c;不仅需要魔法&#xff0c;还需要有一张外网的信用卡来开通会员&#xff0c;使用起来重重不便&#xff0c;有一种想要花钱买服务&#xff0c;都找不到…

tf卡文件隐藏怎样恢复,原来有这三种方法,你了解多少呢?

TF卡是一种便携式存储设备&#xff0c;非常方便用于存储数据。但是&#xff0c;有时TF卡中的数据会被不小心隐藏了&#xff0c;也许是误操作&#xff0c;也许是病毒攻击等原因。所以&#xff0c;下面将讲述如何找回TF卡中被隐藏的数据。 【一】关于TF卡概述 TF卡&#xff08;…

uniapp打包ios保姆式教程【最新】

uniapp打包 打包方式ios打包一、前往官网登录二、添加证书 三、添加标识符(Identifiers)四、添加安装ios测试机(Devices)五、获取证书profile文件六、生成并下载p12文件七、开始打包 打包方式 安卓打包直接使用公共测试证书即可打包成功&#xff0c;简单方便&#xff0c;这里我…

【数据库数据恢复】sql server数据库无法附加查询的数据恢复案例

数据库数据恢复环境&#xff1a; 一台Dell PowerEdge某型号存储&#xff0c;数块SAS硬盘分别组建raid1和raid5两组磁盘阵列。其中2块磁盘组建的RAID1&#xff0c;用于安装操作系统&#xff1b;其余几块磁盘组建raid5&#xff0c;用于存放数据。 上层安装的windows服务器&#x…

vue中动态使用vh calc设置高度

动态设置高度 <div class"user_menu_box" :style"menuHeight"><!-- 用户信息 --><div class"user_info" :class"{ menu-collase: isCollapse }"><imgsrc"/assets/login_images/bg.jpg"alt"暂无图…

【python数据分析】对python开发岗位需求进行分析可视化

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 什么是数据分析 明确目的–获得数据(爬虫&#xff0c;现有&#xff0c;公开的数据)–数据预处理——数据可视化——结论 准备 环境使用&#xff1a; 在开始写我们的代码之前&#xff0c;我们要准备好运行代码的程序 Anacon…

空中下载技术(OTA)电控信息安全

随着汽车电子控制系统功能复杂度和数据颗粒度呈阶梯式增加&#xff0c;其发展速度逐渐超越网络安全防护方法、技术和标准的发展&#xff0c;现阶段汽车电子正面临巨大的网络信息安全风险&#xff0c;对功能安全的潜在影响也仍在探索和解决中&#xff0c;信息安全问题已经成为影…

maven从入门到精通 第五章 在IDEA2023中使用Maven

这里写自定义目录标题 一 Maven基础回顾1 archetype2 指定自己的maven工程所在的位置3 接下来是用文本编辑器打开自己下载的maven文件下的 conf >settings 二 创建maven子工程1 配置环境&#xff0c;测试运行2 打包maven的三种方式2.1 点击maven左侧的lifecycle2.2 点击m标签…

苹果录屏功能在哪?苹果如何进行屏幕录制?

案例&#xff1a;想知道苹果手机和苹果电脑的录屏功能在哪&#xff1f; 【用苹果手机和电脑很久了&#xff0c;但是我还是不知道它们的录屏功能在哪&#xff0c;如何使用&#xff1f;有没有小伙伴了解苹果的录屏功能&#xff1f;可以教教我吗&#xff1f;】 苹果手机和电脑自…

copilot 逆向

原文&#xff1a; copilot-explorer | Hacky repo to see what the Copilot extension sends to the server 对我来说&#xff0c;Github Copilot 极其有用。它经常能神奇地读懂我的想法并给出有用的建议。最让我惊讶的是&#xff0c;它能够从周围的代码中正确地“猜测”出函数…

Android 音频开发——Audio概览(八)

Audio 是 Android 系统中比较重要的一个模块,在 Android 中负责音频方面的数据流传输和控制功能,也负责音频设备的管理。 一、系统架构 Android 音频架构定义了音频功能的实现方式,并指出实现中所涉及的相关源代码。 应用框架 应用框架包含应用代码,该代码使用 android.me…

【分布式】分布式共识算法 --- RAFT

2.CAP原则 CAP原则又称CAP定理&#xff0c;指的是在一个分布式系统中&#xff0c;一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;、分区容错性&#xff08;Partition tolerance&#xff09; It states, that though its desirable t…