SpringBoot+thymeleaf 发送邮件

SpringBoot+thymeleaf发送邮件

在Spring Cloud项目中有几个服务都需要发送邮件。如果每一个服务都写一遍邮件发送代码,不仅重复代码比较多,而且维护起来也比较麻烦;就想着写一个单独的邮件模块。服务要发送邮件直接调用模块里的接口就好了。思路有两种:1.新建一个邮件服务,需要发邮件的时候通过Spring Cloud跨服务访问里面对应的Controller,2.新建一个邮件的jar包,需要发邮件的服务引入jar包,直接调用jar包里面的Service

第一次写博客,有不对的地方麻烦告诉我下;谢谢!

我这里是新建的jar包;简单实现了 文本、HTML、附件、多个附件、模板 邮件的发送

新建jar包代码

1.在pom.xml文件中添加SpringBoot-mail引用

		<!-- Spring 邮件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <!-- Spring thymeleaf 邮件模板 引擎 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

2.添加配置类 SpringMailConfig (我这里将配置放在JavaBean中,也可以写到配置文件中)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSenderImpl;

import java.util.Properties;

@Configuration
public class SpringMailConfig {

    // 发送邮件服务器
    private final static String HOST = "smtp.qq.com";
    // 邮箱
    private final static String USERNAME = "****@qq.com";
    // 客户端授权码
    private final static String PASSWORD = "****";

    private final static String PROPERTY_MAIL_SMTP_AUTH = "true";
    private final static String PROPERTY_mail_smtp_starttls_enable = "true";
    private final static String PROPERTY_mail_smtp_starttls_required = "true";

    @Bean
    public JavaMailSenderImpl mailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();

        // 设置参数
        mailSender.setHost(HOST);
        mailSender.setUsername(USERNAME);
        mailSender.setPassword(PASSWORD);

        Properties properties = mailSender.getJavaMailProperties();
        properties.setProperty("mail.smtp.auth",PROPERTY_MAIL_SMTP_AUTH);
        properties.setProperty("mail.smtp.starttls.enable",PROPERTY_mail_smtp_starttls_enable);
        properties.setProperty("mail.smtp.starttls.required",PROPERTY_mail_smtp_starttls_required);
        mailSender.setJavaMailProperties(properties);

        return mailSender;
    }

}

3.添加发送邮件类 MailService

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.List;
import java.util.Map;

@Component
public class MailService {

    @Autowired
    private JavaMailSenderImpl javaMailSenderImpl;

    @Autowired
    private TemplateEngine templateEngine;

    /**
     * 简单邮件
     * @param to       接收人
     * @param subject  主题
     * @param content  内容
     * @return
     */
    public String sendSimpleEmail(String to,String subject,String content) {

        try {
            SimpleMailMessage message = new SimpleMailMessage();
            message.setFrom(javaMailSenderImpl.getUsername());
            message.setTo(to); // 接收地址
            message.setSubject(subject); // 标题
            message.setText(content); // 内容
            javaMailSenderImpl.send(message);

            return "发送成功";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

    /**
     * html 邮件
     * @param to       接收人
     * @param subject  主题
     * @param html     内容
     */
    public String sendHtmlMail(String to,String subject,String html){

        try {
            MimeMessage mimeMessage = javaMailSenderImpl.createMimeMessage();
            // 设置utf-8编码,否则邮件会有乱码
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            messageHelper.setFrom(javaMailSenderImpl.getUsername());
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            messageHelper.setText(html, true);
            javaMailSenderImpl.send(mimeMessage);

            return "发送成功";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

    /**
     * 带附件  邮件
     * @param to        接收人
     * @param subject   主题
     * @param content   内容
     * @param isHtml    是否是html 邮件  false:普通邮件,true:html邮件
     * @param fileName  文件名称
     * @param filePath  文件路径
     * @return
     */
    public String sendFileMail(String to,String subject,String content,boolean isHtml,String fileName,String filePath){

        try {
            MimeMessage mimeMessage = javaMailSenderImpl.createMimeMessage();
            // 设置utf-8编码,否则邮件会有乱码
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            messageHelper.setFrom(javaMailSenderImpl.getUsername());
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            messageHelper.setText(content,isHtml);

            // 设置附件
            FileSystemResource file=new FileSystemResource(new File(filePath));
            if(StringUtils.isBlank(fileName)) {
                // 文件名为空时,取文件本身名称
                fileName = file.getFilename();
            }
            messageHelper.addAttachment(fileName,file);
            javaMailSenderImpl.send(mimeMessage);

            return "发送成功";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }

    }

    /**
     * 多附件 邮件
     * @param to       接收人
     * @param subject  主题
     * @param content  内容
     * @param isHtml   是否是html 邮件  false:普通邮件,true:html邮件
     * @param list     附件集合  filepath:附件路径,fileName:附件名
     * @return
     */
    public String sendFilesMail(String to, String subject, String content, boolean isHtml, List<Map<String,String>> list){

        try {
            MimeMessage mimeMessage = javaMailSenderImpl.createMimeMessage();
            // 设置utf-8编码,否则邮件会有乱码
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            messageHelper.setFrom(javaMailSenderImpl.getUsername());
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            messageHelper.setText(content,isHtml);

            // 设置附件
            for (Map<String,String> map : list) {
                FileSystemResource file = new FileSystemResource(new File(map.get("filepath")));
                String fileName = map.get("fileName");
                if(StringUtils.isBlank(fileName)){
                    // 文件名为空时,取文件本身名称
                    fileName = file.getFilename();
                }
                messageHelper.addAttachment(fileName,file);
            }

            javaMailSenderImpl.send(mimeMessage);

            return "发送成功";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }

    }

    /**
     * 模板 邮件
     * @param to       接收人
     * @param subject  主题
     * @param tplStr   模板路径   默认路径为 resources/templates 这里传该路径下 之后的路径  mail/模板名称  例 email/templateMail 这里不用加后缀
     * @param map      绑定到模板的参数
     * @return
     */
    public String sendTemplateMail(String to, String subject, String tplStr, Map<String,Object> map){

        try {
            MimeMessage mimeMessage = javaMailSenderImpl.createMimeMessage();
            // 设置utf-8编码,否则邮件会有乱码
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            messageHelper.setFrom(javaMailSenderImpl.getUsername());
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);

            // 设置模板参数
            Context context = new Context();
            context.setVariables(map);
            // 将参数 绑定到模板中
            String tempContent = templateEngine.process(tplStr, context);

            messageHelper.setText(tempContent,true);
            javaMailSenderImpl.send(mimeMessage);

            return "发送成功";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

    /**
     * 带附件 模板 邮件
     * @param to        接收人
     * @param subject   主题
     * @param tplStr    模板路径   默认路径为 resources/templates 这里传该路径下 之后的路径  mail/模板名称  例 email/templateMail 这里不用加后缀
     * @param map       绑定到模板的参数
     * @param fileName  附件名
     * @param filePath  附件路径
     * @return
     */
    public String sendTemplateFileMail(String to, String subject, String tplStr, Map<String,Object> map, String fileName,String filePath){

        try {
            MimeMessage mimeMessage = javaMailSenderImpl.createMimeMessage();
            // 设置utf-8或GBK编码,否则邮件会有乱码
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            messageHelper.setFrom(javaMailSenderImpl.getUsername());
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);

            // 设置模板参数
            Context context = new Context();
            context.setVariables(map);
            // 将参数 绑定到模板中
            String tempContent = templateEngine.process(tplStr, context);

            messageHelper.setText(tempContent,true);

            // 设置附件
            FileSystemResource file=new FileSystemResource(new File(filePath));
            if(StringUtils.isBlank(fileName)) {
                // 文件名为空时,取文件本身名称
                fileName = file.getFilename();
            }

            messageHelper.addAttachment(fileName,file);

            javaMailSenderImpl.send(mimeMessage);

            return "发送成功";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

    /**
     * 多附件 模板 邮件
     * @param to       接收人
     * @param subject  主题
     * @param tplStr   模板路径   默认路径为 resources/templates 这里传该路径下 之后的路径  mail/模板名称  例 email/templateMail 这里不用加后缀
     * @param map      绑定到模板的参数
     * @param list     附件集合  filepath:附件路径,fileName:附件名
     * @return
     */
    public String sendTemplateFilesMail(String to, String subject, String tplStr, Map<String,Object> map, List<Map<String,String>> list){

        try {
            MimeMessage mimeMessage = javaMailSenderImpl.createMimeMessage();
            // 设置utf-8编码,否则邮件会有乱码
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            messageHelper.setFrom(javaMailSenderImpl.getUsername());
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);

            // 设置模板参数
            Context context = new Context();
            context.setVariables(map);
            // 将参数 绑定到模板中
            String tempContent = templateEngine.process(tplStr, context);

            messageHelper.setText(tempContent,true);

            // 设置附件
            for (Map<String,String> fileMap : list) {
                FileSystemResource file = new FileSystemResource(new File(fileMap.get("filepath")));
                String fileName = fileMap.get("fileName");
                if(StringUtils.isBlank(fileName)){
                    // 文件名为空时,取文件本身名称
                    fileName = file.getFilename();
                }
                messageHelper.addAttachment(fileName,file);
            }

            javaMailSenderImpl.send(mimeMessage);

            return "发送成功";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

}

4.添加邮件模板 templateMail.html

模板路径默认为 resources/templates 下面测试类代码中传的路径是在该路径下之后的路径(我这里的目录路径是resources/templates/mail/);

模板模板目录结构在这里插入图片描述
模板代码

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>模板邮件</title>
</head>
<body>
    模板 邮件 测试: <font color='red' size='30' th:text="${username}"></font>
</body>
</html>

这里是让 Spring 加载配置类和发送邮件类的文件(如果项目能扫描到,也可以不添加)

在 resources 目录下添加 META-INF文件,然后在该文件夹下添加 spring.factories 文件
目录 resources/META-INF/spring.factories 让 Spring 加载配置类和发送邮件类
文件代码

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  包路径.SpringMailConfig,\
  包路径.MailService

代码相关博客
https://www.cnblogs.com/huanghzm/p/12217630.html
https://www.jb51.net/article/112979.htm

服务中调用代码

5.测试类代码

在需要发送邮件的服务中添加调用代码

/** 导包 */

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
	/** 测试代码 */
	
    @Autowired
    private MailService mailService;

    /**
     * 简单 邮件
     * @return
     */
    @Override
    public String sendSimpleEmail() {
        return mailService.sendSimpleEmail("****@qq.com","测试","1111111111111111ceshi");
    }

    /**
     * html 邮件
     * @return
     */
    @Override
    public String sendHtmlMail() {

        // html 字符串
        String html = "<!DOCTYPE html>" +
                "<html lang=\"zh-CN\">" +
                "<header></header>" +
                "<body>" +
                "<div><a href=\"https://www.baidu.com\">  html 邮箱测试 百度  </a></div>" +
                "</body>" +
                "</html>";

        return mailService.sendHtmlMail("****@qq.com","测试",html);
    }

    /**
     * 带附件 邮件
     * @return
     */
    @Override
    public String sendFileMail() {
        return mailService.sendFileMail("****@qq.com","测试","附件邮件测试……",false,
                "1111.docx","C:\\Users\\admin\\Desktop\\新建a文档.docx");
    }

    /**
     * 多附件 邮件
     * @return
     */
    @Override
    public String sendFilesMail() {

        // 附件集合
        List<Map<String,String>> list = new ArrayList<>();

        Map<String,String> map1 = new HashMap<>();
        map1.put("filepath","C:\\Users\\admin\\Desktop\\新建a文档.docx");
        map1.put("fileName","111.docx");

        Map<String,String> map2 = new HashMap<>();
        map2.put("filepath","C:\\Users\\admin\\Desktop\\新建b文档.docx");
        map2.put("fileName","222.docx");

        Map<String,String> map3 = new HashMap<>();
        map3.put("filepath","C:\\Users\\admin\\Desktop\\新建c文档.docx");

        list.add(map1);
        list.add(map2);
        list.add(map3);

        return mailService.sendFilesMail("****@qq.com","测试","多附件邮件测试……",false,list);
    }

    /**
     * 模板 邮件
     * @return
     */
    @Override
    public String sendTemplateMail() {

        // 模板参数
        Map<String, Object> map = new HashMap<>();
        map.put("username", "ceshiceshi");

        return mailService.sendTemplateMail("****@qq.com", "测试", "email/templateMail", map);

    }

    /**
     * 带附件 模板 邮件
     * @return
     */
    @Override
    public String sendTemplateFileMail() {

        // 模板参数
        Map<String, Object> map = new HashMap<>();
        map.put("username", "ceshiceshi");

        return mailService.sendTemplateFileMail("****@qq.com", "测试", "email/templateMail", map,
                "1111.docx","C:\\Users\\admin\\Desktop\\新建a文档.docx");
    }

    /**
     * 多附件 模板 邮件
     * @return
     */
    @Override
    public String sendTemplateFilesMail() {

        // 模板参数
        Map<String, Object> map = new HashMap<>();
        map.put("username", "ceshiceshi");

        // 附件集合
        List<Map<String,String>> list = new ArrayList<>();

        Map<String,String> map1 = new HashMap<>();
        map1.put("filepath","C:\\Users\\admin\\Desktop\\新建a文档.docx");
        map1.put("fileName","111.docx");

        Map<String,String> map2 = new HashMap<>();
        map2.put("filepath","C:\\Users\\admin\\Desktop\\新建b文档.docx");
        map2.put("fileName","222.docx");

        Map<String,String> map3 = new HashMap<>();
        map3.put("filepath","C:\\Users\\admin\\Desktop\\新建c文档.docx");

        list.add(map1);
        list.add(map2);
        list.add(map3);

        return mailService.sendTemplateFilesMail("****@qq.com", "测试", "email/templateMail", map, list);
    }

参考博客:

https://www.cnblogs.com/codeplus/archive/2011/11/03/2232893.html
https://blog.csdn.net/qq_36761831/article/details/104129547

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值