• Spring Boot:JavaMailSender发送邮件


    项目中经常会有这样的需求,用户注册成功,需要给用户发送一封邮件。邮件需要有一定格式和样式。本次例子中用freemarker做样式,其他的模版引擎类似。

    首先Spring Boot项目,项目结构如下

    在pom.xml文件中添加依赖

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

    配置发件人信息,发件人邮箱需要开通POP3/SMTP服务,如下图(我是采用126邮箱):

    然后在application.properties中添加配置文件:

    然后在service层中添加MailService类,代码如下

    import freemarker.core.ParseException;
    import freemarker.template.MalformedTemplateNameException;
    import freemarker.template.Template;
    import freemarker.template.TemplateException;
    import freemarker.template.TemplateNotFoundException;
    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.stereotype.Service;
    import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
    import org.springframework.util.ResourceUtils;
    import org.springframework.web.servlet.view.freemarker.FreeMarkerConfig;
    
    import javax.mail.MessagingException;
    import javax.mail.internet.MimeMessage;
    import java.io.File;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    
    @Service
    public class MailService {
    
        private final static Logger logger = LoggerFactory.getLogger(MailService.class);
    
        @Value("${spring.mail.username}")
        private String from;
    
        @Autowired
        private JavaMailSender mailSender;
    
        @Autowired
        private FreeMarkerConfig freeMarkerConfig;
    
        // send simple email
        public String sendSimple(String to, String title, String content) {
            SimpleMailMessage message = new SimpleMailMessage();
    
            message.setFrom(from);
            message.setTo(to);
            message.setSubject(title);
            message.setText(content);
    
            mailSender.send(message);
    
            logger.info("{} send email to {}", from, to);
            return "SUCESS";
        }
    
        // send template mail
        public String sendTemplateMail(String to, String title) {
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            MimeMessageHelper helper;
            try {
                helper = new MimeMessageHelper(mimeMessage, true);
    
                helper.setFrom(from);
                helper.setTo(to);
                helper.setSubject(title);
    
                Map<String, Object> model = new HashMap<>();
                model.put("params", from);
                Template template = freeMarkerConfig.getConfiguration().getTemplate("message.ftl");
                String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
    
                helper.setText(text, true);
    
                mailSender.send(mimeMessage);
    
            } catch (MessagingException e) {
                e.printStackTrace();
            } catch (MalformedTemplateNameException e) {
                e.printStackTrace();
            } catch (ParseException e) {
                e.printStackTrace();
            } catch (TemplateNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (TemplateException e) {
                e.printStackTrace();
            }
    
    
            return "SUCEESS";
        }
    
        // send template mail with attachment
        public String sendAttactmentMail(String to, String title){
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            MimeMessageHelper helper;
            try {
                helper = new MimeMessageHelper(mimeMessage, true);
    
                helper.setFrom(from);
                helper.setTo(to);
                helper.setSubject(title);
    
                // add template
                Map<String, Object> model = new HashMap<>();
                model.put("params", from);
                Template template = freeMarkerConfig.getConfiguration().getTemplate("message.ftl");
                String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
                helper.setText(text, true);
    
                // add attachment
                File file = ResourceUtils.getFile("classpath:static/flcl.jpg");
                helper.addAttachment(file.getName(), file);
    
                mailSender.send(mimeMessage);
    
            } catch (MessagingException e) {
                e.printStackTrace();
            } catch (MalformedTemplateNameException e) {
                e.printStackTrace();
            } catch (ParseException e) {
                e.printStackTrace();
            } catch (TemplateNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (TemplateException e) {
                e.printStackTrace();
            }
            return "SUCCESS";
        }
    }

    这个service中写了三个方法,三个方法的作用分别对应于:发送简单邮件发送模版邮件发送带附件的模版邮件

    核心方法是 mailSender.send(message) ,message对象根据发送的邮件类型不同而不同,主要有MimeMessage MimeMessageHelper

    发送带附件的模板邮件方式是三者中最复杂,首先创建邮件对象MimeMessage ,然后通过MimeMessage对象创建MimeMessageHelper(此对象的作用:向MimeMessage对象中填充数据的助手),通过向MimeMessageHelper对象中添加一些属性,例如发件人、收件人、邮件主题、模版、附件。其中freemarker模板文件xxx.ftl放在resources文件夹下中template(通过FreemakrerConfig获取xxx.ftl的Template对象,然后转换为String),其中附件flcl.jpg放在resources文件夹中的static中(通过ResourceUtils获取文件对象File)。属性添加完成后,就可以发送了。

    然后在controller或者其他service层中调用该方法就可以了。

     

    补充:

    message.ftl文件内容如下

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Hello</title>
    </head>
    <body>
    <h1>Send email</h1>
    <div>this email come from ${params}</div>
    </body>
    </html> 

    发送成功后,可在收件箱中收到邮件

  • 相关阅读:
    Python单元测试之unittest基础
    linux--硬链接和软链接
    12-8 istio核心功能实战-----可观察性(程访问遥测插件)
    12-7 istio核心功能实战-----可观察性(网络可视化)
    12-6 istio核心功能实战-----可观察性(分布式追踪)
    12-3 部署面向生产的istio-----核心组件
    12 ServiceMesh代表作istio-----12-1 ServiceMes、Istio架构原理
    11-7 Grafana看板和邮件报警
    11-6 监控落地
    11-4 部署前奏-Helm&Operator
  • 原文地址:https://www.cnblogs.com/colin220/p/9142189.html
Copyright © 2020-2023  润新知