SpringBoot 邮件推送功能

鞠躬, 道歉

抱歉,迟到了近一年的更新,这一年挺忙的,发生了很多事情,就厚脸皮拖更了,抱歉。
现在状态回来了,打算分享下近期学到的东西,这一年期间学到的东西可能会随意更新,其实也就是玩了下 C# + unity3D,本来打算做个长期项目,但是申报比赛连预选都没有过,预选都是垫底的。项目展示视频见这个。还有就是和学院老师做了智慧博物馆的项目,文物的建模与 AR 以及互动小游戏都有参与。

but,从去年 10 月份开始又重新开始学 Java 和 SSM 的一些东西,上面说的以后应该没有机会玩了,AR 倒是有时间可以分享给大家,但是项目那些演示视频暂时不方便公开。教程的话网上蛮多的,我用的是Vuforia这个,和 unity3D 契合度蛮高的。想玩的朋友可以去弄弄,挺简单的。

之前一个unity3D 项目的展示视频

正题

挺长时间了,一直在学 Spring、SpringMVC、SpringBoot、Mybatis 这些,但是感觉学了蛮久但不精通,也就不敢乱分享高深的。现在在做一个系统,需要发送邮件给用户,网上找了一圈相关博客,参考大佬做了自己的一个记录。也借机回归一周一更的状态,不写点东西对不起大家,嘿嘿。

在我们平时,时常需要利用邮箱注册各种各样的账号或者接收一些通知信息。这使得一个功能完善的系统必然会有一个邮件发送功能。下面就是我近期学习的一个邮件发送系统 demo。

介绍

Spring 项目中,邮件发送使用 Spring 提供的org.springframework.mail.javamail.JavaMailSender,它提供了一些简单易用的方法,可以发送简单邮件带附件的邮件HTML 格式的邮件、以及依靠固定模板的邮件

引入 pom.xml 依赖

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

配置(记得重新配置发件邮箱及密码)

请修改 username 及 password 为你的发件邮箱,各平台发件密码规格不一样,切需要卡通 smtp 功能,请看各平台要求。
之前用 QQ 邮箱要求配置后,测试好多次都无法发送,建议使用其他邮箱,笔者用 163 邮箱,但各位注意163 邮箱默认在邮件后附带推广,记得在设置中关闭,之前测试的时候很坑。

server:
  port: 8080

spring:
  mail:
    host: smtp.163.com
    username: 123456789@163.com
    password: 123456789
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true

发送简单邮件代码展示

// 简单邮件
@RequestMapping("sendSimpleEmail")
public String sendSimpleEmail() {
    try {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(toEmail); // 接收地址,可传入数组进行群发
        message.setSubject("新年好"); // 标题
        message.setText("新年快乐,完事大吉\n 新年新气象"); // 内容
        javaMailSender.send(message);
        return "发送成功";
    } catch (Exception e) {
        e.printStackTrace();
        return e.getMessage();
    }
}

启动项目, 发送 http://localhost:8080/email/sendSimpleEmail 即可发送邮件
结果如下:
23270425739948f388b182547a2673d3_TIM20190330103415.png

完整示例(记得更换目标邮箱)

请看以下代码,或 GitHub 地址 clone 项目查看,有完整注释。

package com.mxwbq.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import javax.mail.internet.MimeMessage;
import java.io.File;

/**
 * Created by mxwbq on 2019/3/29.
 */
@RestController
@RequestMapping("/email")
public class EmailController {

    @Autowired
    private JavaMailSender javaMailSender;

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

    // 目标邮箱地址,记得更换
    private String toEmail = "123456789@163.com";

    @Autowired
    private TemplateEngine templateEngine;

    // 简单邮件
    @RequestMapping("sendSimpleEmail")
    public String sendSimpleEmail() {
        try {
            SimpleMailMessage message = new SimpleMailMessage();
            message.setFrom(from);
            message.setTo(toEmail); // 接收地址,可传入数组进行群发,下同
            message.setSubject("新年好"); // 标题
            message.setText("新年快乐,完事大吉\n 新年新气象"); // 内容
            javaMailSender.send(message);
            return "发送成功";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

    // 发送Html格式邮件
    @RequestMapping("sendHtmlEmail")
    public String sendHtmlEmail() {
        MimeMessage message = null;
        try {
            message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(toEmail); // 接收地址
            helper.setSubject("HTML格式的邮件"); // 标题
            // 带HTML格式的内容
            StringBuffer sb = new StringBuffer(
                    "<h1><p style='color:#42b983'>使用Spring Boot发送HTML格式邮件</p></h1>" +
                    "<p>这里是正文:</p>" +
                    "<p>这里是听雨轩地址:www.nucode.cn</p>");
            helper.setText(sb.toString(), true);  // 第二个参数 true 代表规定邮件格式为HTML
            javaMailSender.send(message);
            return "发送成功";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

    // 发送邮件携带附件
    @RequestMapping("sendAttachmentsMail")
    public String sendAttachmentsMail() {
        MimeMessage message = null;
        try {
            message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(toEmail); // 接收地址
            helper.setSubject("带附件的邮件"); // 标题
            helper.setText("详情参见附件内容!"); // 内容
            // 传入附件
            FileSystemResource file = new FileSystemResource(new File("src\\main\\resources\\static\\file\\SpringBoot_Email文档.docx"));
            helper.addAttachment("SpringBoot_Email文档.docx", file);
            javaMailSender.send(message);
            return "发送成功";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

    // 发送附带静态资源的邮件
    @RequestMapping("sendInlineMail")
    public String sendInlineMail() {
        MimeMessage message = null;
        try {
            message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(toEmail); // 接收地址
            helper.setSubject("带静态资源的邮件"); // 标题
            helper.setText("<html><body>生日快乐:<img src='cid:img'/></body></html>", true); // 内容
            // 传入附件
            FileSystemResource file = new FileSystemResource(new File("src/main/resources/static/img/礼物.jpg"));
            helper.addInline("img", file);
            javaMailSender.send(message);
            return "发送成功";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

    // 发送模板邮件
    @RequestMapping("sendTemplateEmail")
    public String sendTemplateEmail(String registerURL) {
        MimeMessage message = null;
        try {
            message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(toEmail); // 接收地址
            helper.setSubject("邮件模板测试"); // 标题
            // 处理邮件模板
            Context context = new Context();
            context.setVariable("registerURL", registerURL);
            String template = templateEngine.process("register", context);
            helper.setText(template, true);
            javaMailSender.send(message);
            return "发送成功";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }
}

项目 GitHub 地址

https://github.com/mxbq/SpringBoot_Study

说明

本文参考自 MrBird 大佬的博客:https://mrbird.cc/Spring-Boot-Email.html,有删改及自我实操问题汇总。

新的开始,不再颓废。
谢谢大家


以上