SpringBoot 实现发送邮件

一、邮件服务器与传输协议

要在网络上实现邮件功能,必须要有专门的邮件服务器。它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
这些邮件服务器类似于现实生活中的邮局。

1、电子邮件协议
电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。其中邮件的创建和发送只需要用到 SMTP协议,

  • SMTP(Simple Mail Transfer Protocol)协议
    SMTP即简单邮件传输协议,发送邮件的协议,默认端口为25
    通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。
    SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。

  • POP3(Post Office Protocol 3)协议
    POP3即邮局协议,接收邮件的协议,默认端口为110,
    通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

  • IMAP(Internet Mail Access Protocol)协议
    IMAP即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。
    在这里插入图片描述
    参考网易邮箱:什么是POP3、SMTP和IMAP?

二、SpringBoot发送邮件

这里使用 网易邮箱作为发送者来给 QQ邮箱发送邮件。
发送邮件之前,我们需要先获取 网易邮箱的授权码
在设置中,开启开启服务,短信验证之后,就会获取到授权码(网易这边只显示一次,记得保存好)。
在这里插入图片描述

1、创建 SpringBoot项目引入依赖

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

2、YML配置邮件信息

spring:
  mail:
    # 邮件服务地址
    host: smtp.163.com
    # 默认端口25,可不写
    port: 25
    # 编码格式
    default-encoding: utf-8
    # 发送者用户名
    username: xxx@163.com
    # 授权码,刚才获取的代码
    password: xxx    
    # 其它参数
#    properties:
#      mail:
#        smtp:
#          # 如果是用 SSL 方式,需要配置如下属性
#          ssl:
#            enable: true
#            required: true
#          # 邮件接收时间的限制,单位毫秒
#          timeout: 10000
#          # 连接时间的限制,单位毫秒
#          connectiontimeout: 10000
#          # 邮件发送时间的限制,单位毫秒
#          writetimeout: 10000

当我们进行好 yml 配置后,SpringBoot使用MailSenderAutoConfiguration会帮助我们自动配置 JavaMailSender。

Spring框架中用于Java邮件支持的接口和类组织如下:

  • MailSender interface:发送简单基础电子邮件的顶级接口;

  • JavaMailSender interface:是MailSender的子接口。它支持MIME消息,并且主要与MimeMessageHelper类一起用于创建MimeMessage。

  • JavaMailSenderImpl class:实现了JavaMailSender 的接口,它支持MimeMessage和SimpleMailMessage;

  • MailMessage interface:创建邮件消息的顶级接口;

  • SimpleMailMessage class:用于创建简单的邮件消息,包括from,to,cc,subject,text和sentDate等字段;

  • MimeMailMessage class:用于创建支持MIME的邮件消息,主要与MimeMessageHelper类一起用于创建MimeMessage;

  • MimeMessageHelper class:用于创建MIME消息的帮助类。它为HTML布局中的图像,典型邮件附件和文本内容提供支持等。

  • MimeMessagePreparator interface:提供一个回调接口,用于编写MIME消息;

3、创建邮件发送类
当我们进行好 yml 配置后,SpringBoot会帮助我们自动配置 JavaMailSender,然后我们调用JavaMailSender接口就实现操作发送邮件了。
下面写几种发送邮件的方式。

@Service
public class MailService {
    private static final String SENDER = "xxx@163.com";
    @Autowired
    private JavaMailSender mailSender;
    @Autowired
    private TemplateEngine templateEngine;

    /**
     * 发送普通邮件
     *
     * @param to      收件人
     * @param subject 主题(标题)
     * @param content 内容
     */
    public void sendSimpleMail(String to, String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(SENDER);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(content);
        try {
            mailSender.send(message);
        } catch (Exception e) {
            System.out.println("发送普通邮件时发生异常!" + e);
        }
    }

    /**
     * 发送带附件的邮件
     *
     * @param to       收件人
     * @param subject  主题
     * @param content  内容
     * @param fileList 附件
     */
    public void sendFileMail(String to, String subject, String content, List<File> fileList) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            //true表示需要创建一个multipart message
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(SENDER);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);

            if (fileList != null && fileList.size() > 0) {
                for (File file : fileList) {
                    FileSystemResource fileSystemResource = new FileSystemResource(file);
                    String fileName = fileSystemResource.getFilename();
                    helper.addAttachment(fileName, fileSystemResource);
                }
            }
            mailSender.send(message);
        } catch (MessagingException e) {
            System.out.println("发送带附件的邮件时发生异常!" + e);
        }
    }

    /**
     * 发送HTML静态文件的邮件
     *
     * @param to       收件人
     * @param subject  主题
     * @param content  内容
     * @param srcIdMap 需要替换的静态文件(给html中标记id不赋值的话,可以发送,但静态文件不会显示),可为null表示纯HTML文件
     */
    public void sendHtmlMail(String to, String subject, String content, Map<String, String> srcIdMap) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            //true表示需要创建一个multipart message
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(SENDER);
            helper.setTo(to);
            helper.setSubject(subject);
            //true指的是html邮件
            helper.setText(content, true);
            if (srcIdMap != null) {
                for (Map.Entry<String, String> entry : srcIdMap.entrySet()) {
                    FileSystemResource file = new FileSystemResource(new File(entry.getValue()));
                    helper.addInline(entry.getKey(), file);
                }
            }
            mailSender.send(message);
        } catch (MessagingException e) {
            System.out.println("发送HTML静态文件的邮件时发生异常!" + e);
        }
    }

    /**
     * 发送Html模板的邮件
     *
     * @param to       收件人
     * @param subject  主题
     * @param emailInfoMap 模板的数据信息
     */
    public void sendHtmlTemplateMail(String to, String subject, Map<String, Object> emailInfoMap) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            //true表示需要创建一个multipart message
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(SENDER);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setSentDate(new Date());
            // 设置参数, 也可以单独设置c ontext.setVariable("userName", "赵云");
            org.thymeleaf.context.Context context = new Context();
            context.setVariables(emailInfoMap);
            //设置模板,emailTemplate为html文件的文件名,emailTemplate.html或emailTemplate都可以
            helper.setText(templateEngine.process("emailTemplate", context), true);
            mailSender.send(message);
        } catch (MessagingException e) {
            System.out.println("发送Html模板的邮件!" + e);
        }
    }

}

4、在resources/templates目录中新建一个 emailTemplate.html模板文件,由于发送模板邮件

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>邮件模板</title>
</head>
<body>
    <h1>xx公司邀请你投递简历</h1>
    <table border="1" cellpadding="0" cellspacing="0">
        <tr>
            <td>姓 名</td>
            <td>性 别</td>
            <td>出生日期</td>
            <td>职位</td>
        </tr>
        <tr>
            <td><span th:text="${userName}"></span></td>
            <td><span th:text="${sex}"></span></td>
            <td><span th:text="${#dates.format(birthday,'yyyy-MM-dd')}"></span></td>
            <td><span th:text="${office}"></span></td>
        </tr>
    </table>
    <a href="#" th:href="@{http://www.baidu.com(id=${id})}">公司官网</a>
    <h2>期待你的加入</h2>
</body>
</html>

5、在测试类中测试

@SpringBootTest
class Email163ApplicationTests {

    @Autowired
    private MailService mailService;

    private static final String TO = "110xxx@qq.com";

    @Test
    public void testSendSimpleMail(){
        String subject = "测试普通邮件";
        String content = "testSendSimpleMailMessge content";
        mailService.sendSimpleMail(TO, subject, content);
    }

    @Test
    public void testSendFileMail(){
        String subject = "测试带附件的邮件";
        String content = "testSendFileMailMessge content";
        List<File> fileList = new ArrayList<>();
        fileList.add(new File("D:\\E\\电脑壁纸\\11.jpg"));
        fileList.add(new File("D:\\E\\电脑壁纸\\JD导入.xlsx"));
        mailService.sendFileMail(TO, subject, content, fileList);
    }

    @Test
    public void testSendHtmlMail(){
        String subject = "测试HTML静态文件的邮件";
        String htmlContent = "<html><body><h2>testSendSimpleMailMessge</h2> contentn内容,图片1 <br> <img src=\'cid:pic1\'/> <br>图片2 <br> <img src=\'cid:pic2\'/></body></html>";
        Map<String, String> srcIdMap = new HashMap<>(2);
        srcIdMap.put("pic1", "D:\\E\\电脑壁纸\\11.jpg");
        srcIdMap.put("pic2", "D:\\E\\电脑壁纸\\charge.jpg");
        mailService.sendHtmlMail(TO, subject, htmlContent, null);
    }
    @Test
    public void testSendHtmlTemplateMail(){
        String subject = "发送Html模板的邮件";
        Map<String, Object> map = new HashMap<>(4);
        map.put("userName","赵云");
        map.put("sex","男");
        map.put("birthday", new Date());
        map.put("office","打野");

        mailService.sendHtmlTemplateMail(TO, subject, map);
    }

}

在这里插入图片描述
在这里插入图片描述

参考文章:
Spring Boot 官方文档之 Sending Email

—— Stay Hungry. Stay Foolish. 求知若饥,虚心若愚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值