首页 > 技术文章 > Spring boot(六)发送邮件

person008 2018-09-07 15:03 原文

在Spring Boot的工程中的pom.xml中引入spring-boot-starter-mail 依赖包:

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

在 application.properties 中添加邮箱配置,不同的邮箱参数稍有不同,下面列举一个常用邮箱配置。

163 邮箱配置:

spring.mail.host=smtp.163.com //邮箱服务器地址 
spring.mail.username=xxx@oo.com //⽤户名 
spring.mail.password=xxyyooo    //密码 
spring.mail.default-encoding=UTF-8 
//超时时间,可选 
spring.mail.properties.mail.smtp.connectiontimeout=5000  
spring.mail.properties.mail.smtp.timeout=3000 
spring.mail.properties.mail.smtp.writetimeout=5000

JavaMailSender
Spirng 已经帮我们内置了 JavaMailSender,直接在项目中引用即可。

一、我们封装一个 MailService 类来实现普通的邮件发送方法。

@Component
public class MailServiceImpl implements MailService{

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private JavaMailSender mailSender;

    @Value("${spring.mail.username}")
    private String from;

    @Override
    public void sendSimpleMail(String to, String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(content);
        try {
            mailSender.send(message);
            logger.info("简单邮件已经发送。");
        } catch (Exception e) {
            logger.error("发送简单邮件时发生异常!", e);
        }
    }
}

from,即为邮件发送者;
to,邮件接收者;
subject,邮件主题;
content,邮件的主体。
邮件发送者 from 一般采用固定的形式写到配置文件中(配置文件自定义之前已有介绍),也可以直接写发送者邮箱。

编写 test 类进行测试

@RunWith(SpringRunner.class) @Spring BootTest 
public class MailServiceTest {
    @Autowired 
    private MailService MailService;
    @Test 
    public void testSimpleMail() throws Exception { 
        mailService.sendSimpleMail("****@126.com","这是一封简单邮件","⼤家好,这是我的第一封邮件!"); 
    } 
}

二、富文本邮件

在日常使用的过程中,我们通常在邮件中加入图片或者附件来丰富邮件的内容,下面将介绍如何使用 Spring Boot 来发送富文本邮件。

1)发送 HTML 格式邮件

 /**
     * 发送html邮件
     * @param to
     * @param subject
     * @param content
     */
    @Override
    public void sendHtmlMail(String to, String subject, String content) {
        MimeMessage message = mailSender.createMimeMessage();

        try {
            //true表示需要创建一个multipart message
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);

            mailSender.send(message);
            logger.info("html邮件发送成功");
        } catch (MessagingException e) {
            logger.error("发送html邮件时发生异常!", e);
        }
    }

MimeMessageHelper 支持发送复杂邮件模板, 支持文本、附件、HTML、图片等,接下来我们会继续使用。
在测试类中构建 HTML 内容,测试发送:

@Test 
public void testHtmlMail() throws Exception { 
    String content="<html>\n" + 
            "<body>\n" + 
            "    <h3>hello world ! 这是⼀封html邮件!</h3>\n" + 
            "</body>\n" + 
            "</html>"; 
    mailService.sendHtmlMail("ityouknow@126.com","这是一封HTML邮件",content); 
}

2)发送带附件的邮件

在 MailService 添加 sendAttachmentsMail 方法。

public void sendAttachmentsMail(String to, String subject, String content, String filePath){
        MimeMessage message = mailSender.createMimeMessage();

        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);

            FileSystemResource file = new FileSystemResource(new File(filePath));
            String fileName = file.getFilename();
            helper.addAttachment(fileName, file);
            //helper.addAttachment("test"+fileName, file);

            mailSender.send(message);
            logger.info("带附件的邮件已经发送。");
        } catch (MessagingException e) {
            logger.error("发送带附件的邮件时发生异常!", e);
        }
    }

测试方法:

  @Test
    public void sendAttachmentsMail() {
        String filePath="E:\\学习资料\\W3C\\jdk150.ZH_cn.chm";
        mailService.sendAttachmentsMail("peng.li@rongdatech.com", "主题:带附件的邮件", "有附件,请查收!", filePath);
    }

3)发送带静态资源的邮件

邮件中的静态资源一般就是指图片,在 MailService 添加 sendAttachmentsMail 方法。

 /**
     * 发送正文中有静态资源(图片)的邮件
     * @param to
     * @param subject
     * @param content
     * @param rscPath
     * @param rscId
     */
    public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId){
        MimeMessage message = mailSender.createMimeMessage();

        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);

            FileSystemResource res = new FileSystemResource(new File(rscPath));
            helper.addInline(rscId, res);

            mailSender.send(message);
            logger.info("嵌入静态资源的邮件已经发送。");
        } catch (MessagingException e) {
            logger.error("发送嵌入静态资源的邮件时发生异常!", e);
        }
    }

测试方法:

 @Test
    public void sendInlineResourceMail() {
        String rscId = "CES";
        String content="<html><body>这是有图片的邮件:<img src=\'cid:" + rscId + "\' ></body></html>";
        String imgPath = "e:\\CES.jpg";

        mailService.sendInlineResourceMail("peng.li@rongdatech.com", "主题:这是有图片的邮件", content, imgPath, rscId);
    }

上面发送邮件的基础服务就这些了,但是如果我们要做成一个邮件系统的话还需要考虑以下几个问题。

邮件模板

我们会经常收到这样的邮件:

其中只有 neo 这个用户名在变化,其他邮件内容均不变,如果每次发送邮件都需要改动拼接不够优雅,并且 每次模板的修改都需要改动代码非常不方便,因此对于这类邮件需求,都建议做成邮件模板来处理。模板的 本质很简单,就是在模板中替换变化的参数,转换为 HTML 字符串即可,这里以    thymeleaf 为例来演 示。

pom 中导入 thymeleaf 的包

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

在 resorces/templates 下创建 emailTemplate.html

<!DOCTYPE html> 
<html lang="zh" xmlns:th="http://www.thymeleaf.org"> 
    <head> 
        <meta charset="UTF-8"/> 
        <title>邮件模板</title> 
    </head> 
    <body> 
        您好,感谢您的注册,这是⼀封验证邮件,请点击下⾯的链接完成注册,感谢您的⽀持<br/>         
<a href="#" th:href="@{http://www.****.com/register/{id}(id=${id}) }" >激活账号</a> </body> </html>

解析模板并发送

 

 

 @Test
    public void sendTemplateMail() {
        //创建邮件正文
        Context context = new Context();
        context.setVariable("id", "001");
        String emailContent = templateEngine.process("emailTemplate", context);

        mailService.sendHtmlMail("peng.li@rongdatech.com","主题:这是模板邮件",emailContent);
    }

 

推荐阅读