zoukankan      html  css  js  c++  java
  • Springboot下实现邮件发送功能

    Springboot下实现邮件发送功能

    一、几种邮件协议简介

    1.SMTP协议

    SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器

    2.POP3协议

    POP3(Post Office Protocol 3,邮局协议的第3个版本)规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件。POP3服务器则是遵循POP3协议的接收邮件服务器,主要用来接收电子邮件。

    3.IMAP协议

    IMAP(Internet Mail Access Protocol,交互式邮件存取协议)是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。

    二、基于SMTP协议发送邮件

    1.获取QQ邮箱授权码

    获取QQ邮箱授权码步骤1

    获取QQ邮箱步骤2

    获取QQ邮箱步骤3

    2.代码实现

    (1)创建一个Springboot工程

    创建Spring Boot工程

    创建完成后,项目依赖如下:

        <dependency>
        	<groupId>org.springframework.boot</groupId>
       	 	<artifactId>spring-boot-starter-web</artifactId>
        	<version>2.2.1.RELEASE</version>
        </dependency>
    
     	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
    

    (2)编写配置文件

    项目创建成功后,接下来编辑applicaton.properties配置文件:

    spring.mail.host=smtp.qq.com
    spring.mail.port=587
    spring.mail.username=159xxxx63@qq.com
    spring.mail.password=这里填刚才获取的QQ邮箱授权码
    spring.mail.default-encoding=UTF-8
    spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
    spring.mail.properties.mail.debug=true
    

    配置含义如下:

    • 配置 SMTP 服务器地址

    • SMTP 服务器的端口

    • 配置邮箱用户名

    • 配置密码,注意,不是真正的密码,而是刚刚申请到的授权码

    • 默认的邮件编码

    • 配置 SSL 加密工厂

    • 表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误

    如果不知道 smtp 服务器的端口或者地址的的话,可以参考腾讯的邮箱文档

    (3)与发送邮件相关的几个类

    在编写代码前,先来了解两个类:JavaMailSender接口类 、SimpleMailMessage类。

    JavaMailSender接口类定义了邮件发送的send方法,以及创建MimeMessage的方法,但这个接口类并不需要我们自己实现,实现类JavaMailSenderImpl由SpringBoot根据配置文件自动装填各个属性。
    mark

    SimpleMailMessage类是一个邮件消息实体类,包含的成员变量如下:

    mark

    (4)发送简单邮件

    	@Autowired
        JavaMailSender mailSender;
    
    	@Test
        void Test1() {
            SimpleMailMessage msg = new SimpleMailMessage();
            msg.setSubject("测试邮件主题"); 
            msg.setSentDate(new Date());
            msg.setText("这是一封简单的测试邮件");
            msg.setFrom("159xxxx63@qq.com");
            msg.setTo("189xxxx43@qq.com");
            mailSender.send(msg);
        }
    

    效果图:

    简单邮件

    (5)发送带附件的邮件

        @Test
        void test2() throws MessagingException {
            MimeMessage msg = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(msg,true);
            helper.setSubject("测试邮件主题(带附件)");
            helper.setSentDate(new Date());
            helper.setText("这是一封带附件的测试邮件");
            helper.addAttachment("avatar.jpg",new File("D:\avatar.jpg"));
            helper.setFrom("159xxxx63@qq.com");
            helper.setTo("189xxxx43@qq.com");
            mailSender.send(msg);
        }
    
    

    效果图:

    带附件的邮件

    (4)发送正文带图片的邮件

       @Test
        void test3() throws MessagingException {
            MimeMessage msg = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(msg,true);
            helper.setSubject("测试邮件主题(正文带图片)");
            helper.setSentDate(new Date());
            helper.setText("这是一封正文带图片的测试邮件,这是图片1:<img src='cid:p01'>,这是图片2:<img src='cid:p02'>",true);
            helper.addInline("p01", new FileSystemResource(new File("D:\avatar.jpg")));
            helper.addInline("p02", new FileSystemResource(new File("D:\new.jpg")));
            helper.setFrom("159xxxx63@qq.com");
            helper.setTo("189xxxx43@qq.com");
            mailSender.send(msg);
        }
    

    需要注意两个地方:

    • new MimeMessageHelper类时,第一个参数是MimeMessage实例,第二个参数是是否启用“复杂”消息,默认为false,需要设置为true,这样子消息中才能携带图片资源。
    • 调用setText方法时,第一个参数是消息内容,如果带有HTML,那么第二个参数需要设置为true,表示启用HTML,否则邮件内容会解析失败。

    效果图:

    正文带图片资源邮件

    (6)用Thymeleaf自定义邮件模板

    	@Test
        void test4() throws MessagingException {
            MimeMessage msg = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(msg,true);
            helper.setSubject("测试邮件主题(Thymeleaf模板)");
            helper.setSentDate(new Date());
            Context context = new Context();
            context.setVariable("time",new Date());
            context.setVariable("address","FJNU");
            context.setVariable("marker", "天王盖地虎");
            String process = templateEngine.process("mail.html", context);
            helper.setText(process, true);
            helper.setFrom("159xxxx63@qq.com");
            helper.setTo("189xxxx43@qq.com");
            mailSender.send(msg);
        }
    

    Thymeleaf模板:mail.html

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org/">
    <head>
        <meta charset="UTF-8">
        <title>Thymeleaf邮件模板</title>
    </head>
    <body>
    <table border="1px">
        <tr>
            <td>碰头时间</td>
            <td th:text="${time}"></td>
        </tr>
        <tr>
            <td>碰头地点</td>
            <td th:text="${address}"></td>
        </tr>
        <tr>
            <td>暗号</td>
            <td th:text="${marker}"></td>
        </tr>
    </table>
    </body>
    </html>
    

    效果图:

    自定义邮件模板--Thymeleaf

    参考资料

    [1]:什么是POP3、SMTP及IMAP? 

  • 相关阅读:
    用Twebbrowser做可控编辑器与MSHTML(调用js)
    用Twebbrowser做可控编辑器与MSHTML(插入表格)
    用Twebbrowser做可控编辑器与MSHTML
    如何用firefox57看中国大学mooc视频
    学习EXTJS6(8)基本功能-表单的基础表字段Ext.form.field.Basic
    学习EXTJS6(7)基本功能-最常用的表单
    学习EXTJS6(6)基本功能-工具栏和菜单
    学习EXTJS6(5)基本功能-进度条组件
    学习EXTJS6(4)基本功能-信息提示框组件
    学习EXTJS6(3)基本概念
  • 原文地址:https://www.cnblogs.com/blog567/p/12374651.html
Copyright © 2011-2022 走看看