使用Spring Boot发送邮件

本文介绍如何使用Spring Boot发送简易邮件、Html格式带附件的邮件以及利用Thymeleaf模板引擎发送带附件的邮件。通过详细步骤和代码示例,展示配置、实体类创建以及邮件发送过程,帮助开发者快速掌握这项功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近没什么事,就试着学习用Spring Boot发送邮件。发现还是很简单的,就写一篇博客记录一下,与大家共享,万一以后要使用呢。

目录:

  1. 发送简易邮件
  2. 发送Html格式的可带附件的邮件
  3. 发送基于thymeleaf模板引擎的可带附件的邮件

POM文件:

在pom文件中添加:

       <lombok.version>1.16.10</lombok.version>

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

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>

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

配置文件:

application.properties:

#thymeleaf
spring.thymeleaf.mode=HTML
spring.thymeleaf.cache=false
spring.thymeleaf.prefix=classpath:/templates/

spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8
#使用qq发送邮件
spring.profiles.active=qq

application-qq.properties:

# JavaMailSender 邮件发送的配置
spring.mail.host=smtp.qq.com
spring.mail.username=发件人qq
#QQ邮箱的授权码
spring.mail.password=你的qq邮箱授权码

登录QQ邮箱,按下面步骤操作获取授权码
1.
在这里插入图片描述
2.
在这里插入图片描述
3.往下走,开启smtp,获取验证码,如果你之前开启了,就点击下面的生成授权码获取
在这里插入图片描述
application-163.properties:

spring.mail.host=smtp.163.com
spring.mail.username=xxx@163.com
#163邮箱密码
spring.mail.password=xxxxxx

Email实体类:

    private Integer id;
    /** 邮件主题 */
    private String subject;
    /** 邮件显示内容 */
    private String content;
    /** 发送人 */
    private String sender;
    /** 收件人 */
    private String[] recipient;
    /** 抄送人 */
    private String[] cc;
    /** 内容是否是html */
    private boolean isHtml;
    /** 附件列表 一个map存储一个附件的名称和路径 */
    private List<Map<String, String>> attachFiles;
    set/get ...

发送简易邮件:

1.编写一个发送邮件的工具类EmailUtils:添加下面内容

private static final Logger logger = LoggerFactory.getLogger(EmailUtils.class);
    @Autowired
    private JavaMailSender javaMailSender;

    /**
     * 发送简易邮件
     *
     * @param email
     * @return
     */
    public boolean sendSimpleMail(Email email) {
        boolean flag = true;
        try {
            SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
            //发件人
            simpleMailMessage.setFrom(email.getSender());
            //收件人
            simpleMailMessage.setTo(email.getRecipient());
            //抄送人
            simpleMailMessage.setCc(email.getCc());
            //邮件主题
            simpleMailMessage.setSubject(email.getSubject());
            //邮件内容
            simpleMailMessage.setText(email.getContent());
            javaMailSender.send(simpleMailMessage);
        } catch (MailException e) {
            logger.error("邮件发送失败:{}", e.getMessage());
            flag = false;
        }
        return flag;
    }

2.编写单元测试:

    private static final Logger logger = LoggerFactory.getLogger(EmailUtilsTest.class);
    @Autowired
    private EmailUtils emailUtils;
    @Autowired
    private Environment env;
    
    @Test
    public void sendSimpleMail() {
        Email email = new Email();
        email.setSender(env.getProperty("spring.mail.username"));
        email.setRecipient(new String[]{"收件人"});
        email.setCc(new String[]{"抄送人"});
        email.setSubject("主题");
        email.setContent("内容");
        boolean isSend = emailUtils.sendSimpleMail(email);
        logger.info("邮件发送:{}", isSend);
    }

效果如下:
在这里插入图片描述

发送Html格式的可带附件的邮件

1.新建一个常量类保存附件的名称和路径:

	public static final String FILE_NAME = "fileName";
    public static final String FILE_PATH = "filePath";

2.在工具类EmailUtils中添加下面方法:

/**
     * 发送html格式的可带附件的邮件
     * 可多个附件
     *
     * @param email
     */
    public boolean sendHtmlMailWithAttachment(Email email) {
        boolean flag = true;
        try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
            mimeMessageHelper.setSubject(email.getSubject());
            mimeMessageHelper.setText(email.getContent(), email.isHtml());
            mimeMessageHelper.setFrom(email.getSender());
            mimeMessageHelper.setTo(email.getRecipient());
            if (email.getCc() != null) {
                mimeMessageHelper.setCc(email.getCc());
            }
            if (email.getAttachFiles() != null) {
                FileSystemResource file = null;
                for (Map<String, String> attachment : email.getAttachFiles()) {
                    file = new FileSystemResource(attachment.get(FileConstant.FILE_PATH));
                    mimeMessageHelper.addAttachment(attachment.get(FileConstant.FILE_NAME), file);
                }
            }
            javaMailSender.send(mimeMessage);
        } catch (MessagingException e) {
            logger.error("邮件发送失败:{}", e.getMessage());
            flag = false;
        }
        return flag;
    }

3.编写单元测试:

 @Test
    public void sendHtmlMailWithAttachment() {
        Email email = new Email();
        email.setSender(env.getProperty("spring.mail.username"));
        email.setRecipient(new String[]{"收件人"});
        email.setCc(new String[]{"抄送人"});
        email.setSubject("HTML格式的测试邮件");
        email.setContent("<h3><a href='http://www.baidu.com'>百度一下,你就知道</a></h3>");
        email.setHtml(true);
        List<Map<String, String>> maps = new ArrayList<>();
        Map<String, String> map1 = new TreeMap<>();
        map1.put(FileConstant.FILE_NAME, "名称1");
        map1.put(FileConstant.FILE_PATH, "路径1");
        maps.add(map1);
        Map<String, String> map2 = new TreeMap<>();
        map2.put(FileConstant.FILE_NAME, "名称2t");
        map2.put(FileConstant.FILE_PATH, "路径2");
        maps.add(map2);
        Map<String, String> map3 = new TreeMap<>();
        map3.put(FileConstant.FILE_NAME, "名称3");
        map3.put(FileConstant.FILE_PATH, "路径3");
        maps.add(map3);
        email.setAttachFiles(maps);
        boolean isSend = emailUtils.sendHtmlMailWithAttachment(email);
        logger.info("邮件发送:{}", isSend);
    }

效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发送基于thymeleaf模板引擎的可带附件的邮件

1.在resources/templates目录下新建email.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
您好,这是验证邮件,请点击下面的链接完成验证,<br/>
<a th:href="@{${href}}">激活账号</a>
</body>
</html>

2.基于thymeleaf模板引擎发送和前面Html格式的发送其实差不多,只是html格式的邮件是把邮件内容用html代码输入,而thymeleaf模板引擎是获取上下文,设置模板的参数、把解析模板的值作为邮件内容。所以可以复用sendHtmlMailWithAttachment()。
3.编写单元测试

 @Autowired
    private TemplateEngine templateEngine;

    @Test
    public void sendFullMailWithTemplate() {
        Context context = new Context();
        context.setVariable("href", "http://www.baidu.com");
        //解析模板
        String content = templateEngine.process("email", context);

         Email email = new Email();
        email.setSender(env.getProperty("spring.mail.username"));
        email.setRecipient(new String[]{"收件人"});
        email.setCc(new String[]{"抄送人"});
        email.setSubject("HTML格式的测试邮件");
        email.setContent(content );
        email.setHtml(true);
        List<Map<String, String>> maps = new ArrayList<>();
        Map<String, String> map1 = new TreeMap<>();
        map1.put(FileConstant.FILE_NAME, "名称1");
        map1.put(FileConstant.FILE_PATH, "路径1");
        maps.add(map1);
        Map<String, String> map2 = new TreeMap<>();
        map2.put(FileConstant.FILE_NAME, "名称2t");
        map2.put(FileConstant.FILE_PATH, "路径2");
        maps.add(map2);
        Map<String, String> map3 = new TreeMap<>();
        map3.put(FileConstant.FILE_NAME, "名称3");
        map3.put(FileConstant.FILE_PATH, "路径3");
        maps.add(map3);
        email.setAttachFiles(maps);
        boolean isSend = emailUtils.sendHtmlMailWithAttachment(email);
        logger.info("邮件发送:{}", isSend);
    }

效果如下:
在这里插入图片描述
是不是很简单,希望可以帮到正在阅读的你。
如果你有更好想法,欢迎评论。

源码地址:https://github.com/yundiangeqian/email-demo

共同成长,不足之处,请大家指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值