zoukankan      html  css  js  c++  java
  • springboot发送邮件的几种方式

    springboot发送邮件的几种方式

    准备工作(以QQ邮箱为例)

    SMTP 协议全称为 Simple Mail Transfer Protocol,译作简单邮件传输协议,它定义了邮件客户端软件与 SMTP 服务器之间,以及 SMTP 服务器与 SMTP 服务器之间的通信规则。

    也就是说 aaa@qq.com 用户先将邮件投递到腾讯的 SMTP 服务器这个过程就使用了 SMTP 协议,然后腾讯的 SMTP 服务器将邮件投递到网易的 SMTP 服务器这个过程也依然使用了 SMTP 协议,SMTP 服务器就是用来收邮件。

    而 POP3 协议全称为 Post Office Protocol ,译作邮局协议,它定义了邮件客户端与 POP3 服务器之间的通信规则,那么该协议在什么场景下会用到呢?当邮件到达网易的 SMTP 服务器之后, 111@163.com 用户需要登录服务器查看邮件,这个时候就该协议就用上了:邮件服务商都会为每一个用户提供专门的邮件存储空间,SMTP 服务器收到邮件之后,就将邮件保存到相应用户的邮件存储空间中,如果用户要读取邮件,就需要通过邮件服务商的 POP3 邮件服务器来完成。

    所以在使用springboot发送邮件之前,要开启POP3和SMTP协议,需要获得邮件服务器的授权码,这里以qq邮箱为例,展示获取授权码的过程:

    image-20201111225147543

    在账户的下面有一个开启SMTP协议的开关并进行密码验证:

    image-20201111225250134

    以下就是你的授权码:

    image-20201111225344720

    项目创建

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

    配置邮箱基本信息

    spring:
      mail:
        # 配置 SMTP 服务器地址
        host: smtp.qq.com
        # 发送者邮箱
        username: 790933839@qq.com
        # 配置密码,注意不是真正的密码,而是刚刚申请到的授权码
        password: vjstfghblprwbdbd
        # 端口号465或587
        port: 587 
        # 默认的邮件编码为UTF-8
        default-encoding: UTF-8
        # 配置SSL 加密工厂
        properties:
          mail:
            smtp:
              socketFactoryClass: javax.net.ssl.SSLSocketFactory
            #表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
            debug: true
    

    126邮箱SMTP服务器地址:smtp.126.com,端口号:465或者994
    2163邮箱SMTP服务器地址:smtp.163.com,端口号:465或者994
    yeah邮箱SMTP服务器地址:smtp.yeah.net,端口号:465或者994
    qq邮箱SMTP服务器地址:smtp.qq.com,端口号465或587*

    配置好这些后,springboot会自动帮我们配置好相关的邮件发送类。

    发送普通邮件

    发送普通邮件就是指发送一段文本文件。

        @Autowired
        JavaMailSender javaMailSender;   
    		/**
         * 普通邮件发送
         */
        @Test
        public void sendSimpleMail() {
            // 构建一个邮件对象
            SimpleMailMessage message = new SimpleMailMessage();
            // 设置邮件主题
            message.setSubject("这是一封测试邮件");
            // 设置邮件发送者,这个跟application.yml中设置的要一致
            message.setFrom("7*****9@qq.com");
            // 设置邮件接收者,可以有多个接收者,中间用逗号隔开,以下类似
          	// message.setTo("10*****16@qq.com","12****32*qq.com");
            message.setTo("10*****16@qq.com");
            // 设置邮件抄送人,可以有多个抄送人
            message.setCc("12****32*qq.com");
            // 设置隐秘抄送人,可以有多个
            message.setBcc("7******9@qq.com");
            // 设置邮件发送日期
            message.setSentDate(new Date());
            // 设置邮件的正文
            message.setText("这是测试邮件的正文");
            // 发送邮件
            javaMailSender.send(message);
        }
    

    抄送:将邮件同时送给收信人以外的人,用户所写的邮件抄送一份给别人,对方可以看见该用户的E-mail发送给了谁。
    密送:将邮件同时送给收信人以外的人,用户所写的邮件抄送一份给别人,但是对方不能查看到这封邮件同时还发送给了哪些人。

    发送的效果如下:

    image-20201111225443023

    发送带附件的邮件

        /**
         * 发送带附件的邮件
         * @throws MessagingException
         */
        @Test
        public void sendAttachFileMail() throws MessagingException {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
          	// true表示构建一个可以带附件的邮件对象
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
    
            helper.setSubject("这是一封测试邮件");
            helper.setFrom("79******9@qq.com");
            helper.setTo("10*****16@qq.com");
            //helper.setCc("37xxxxx37@qq.com");
            //helper.setBcc("14xxxxx098@qq.com");
            helper.setSentDate(new Date());
            helper.setText("这是测试邮件的正文");
            // 第一个参数是自定义的名称,后缀需要加上,第二个参数是文件的位置
            helper.addAttachment("资料.xlsx",new File("/Users/gamedev/Desktop/测试数据 2.xlsx"));
            javaMailSender.send(mimeMessage);
        }
    

    注意这里的构建邮件对象的方式跟上面有一点不同,因为这里是需要带附件上传,所以先使用javaMailSender创建一个复杂的邮件对象,然后使用MimeMessageHelper对邮件进行配置,MimeMessageHelper 是一个邮件配置的辅助工具类,创建时候的 true 表示构建一个 multipart message 类型的邮件,有了 MimeMessageHelper 之后,我们针对邮件的配置都是由 MimeMessageHelper 来代劳。然后通过addAttachment()方法添加附件。

    发送的效果如下:

    image-20201111225524112

    发送带图片资源的邮件

    图片资源和附件有什么区别呢?图片资源是放在邮件正文中的,即一打开邮件,就能看到图片。但是一般来说,不建议使用这种方式,一些公司会对邮件内容的大小有限制(因为这种方式是将图片一起发送的)。

    /**
     * 正文中带图片的邮件
     * @throws MessagingException
     */
    @Test
    public void sendImgResMail() throws MessagingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        helper.setSubject("这是一封测试邮件");
        helper.setFrom("79*****39@qq.com");
        helper.setTo("10****6@qq.com");
        //helper.setCc("37xxxxx37@qq.com");
        //helper.setBcc("14xxxxx098@qq.com");
        helper.setSentDate(new Date());
        // src='cid:p01' 占位符写法 ,第二个参数true表示这是一个html文本
        helper.setText("<p>hello 大家好,这是一封测试邮件,这封邮件包含两种图片,分别如下</p><p>第一张图片:</p><img src='cid:p01'/><p>第二张图片:</p><img src='cid:p02'/>",true);
        // 第一个参数指的是html中占位符的名字,第二个参数就是文件的位置
        helper.addInline("p01",new FileSystemResource(new File("/Users/gamedev/Desktop/压缩.jpeg")));
        helper.addInline("p02",new FileSystemResource(new File("/Users/gamedev/Desktop/瑞文.jpg")));
        javaMailSender.send(mimeMessage);
    }
    

    发送的效果如下:

    image-20201111225615968

    在公司实际开发中,第一种和第三种都不是使用最多的邮件发送方案。因为正常来说,邮件的内容都是比较的丰富的,所以大部分邮件都是通过 HTML 来呈现的,如果直接拼接 HTML 字符串,这样以后不好维护,为了解决这个问题,一般邮件发送,都会有相应的邮件模板。

    使用 Thymeleaf 作邮件模板

    推荐在 Spring Boot 中使用 Thymeleaf 来构建邮件模板。因为 Thymeleaf 的自动化配置提供了一个 TemplateEngine,通过 TemplateEngine 可以方便的将 Thymeleaf 模板渲染为 HTML ,同时,Thymeleaf 的自动化配置在这里是继续有效的 。

    首先,引入 Thymeleaf 依赖:

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

    创建Thymeleaf模板:

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <p>hello 欢迎加入 xxx 大家庭,您的入职信息如下:</p>
    <table border="1">
        <tr>
            <td>姓名</td>
            <td th:text="${username}"></td>
        </tr>
        <tr>
            <td>工号</td>
            <td th:text="${num}"></td>
        </tr>
        <tr>
            <td>薪水</td>
            <td th:text="${salary}"></td>
        </tr>
    </table>
    <div style="color: #ff1a0e">一起努力创造辉煌</div>
    </body>
    </html>
    

    发送邮件:

        @Autowired
        TemplateEngine templateEngine;
    
        @Test
        public void sendThymeleafMail() throws MessagingException {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            helper.setSubject("这是一封测试邮件");
            helper.setFrom("790933839@qq.com");
            helper.setTo("1032065316@qq.com");
    //        helper.setCc("37xxxxx37@qq.com");
    //        helper.setBcc("14xxxxx098@qq.com");
            helper.setSentDate(new Date());
          	// 这里引入的是Template的Context
            Context context = new Context();
          	// 设置模板中的变量
            context.setVariable("username", "javaboy");
            context.setVariable("num","000001");
            context.setVariable("salary", "99999");
          	// 第一个参数为模板的名称
            String process = templateEngine.process("hello.html", context);
          	// 第二个参数true表示这是一个html文本
            helper.setText(process,true);
            javaMailSender.send(mimeMessage);
        }
    

    发送的效果如下:

    image-20201111225704511

    本文参考:http://springboot.javaboy.org/2019/0717/springboot-mail

  • 相关阅读:
    [国家集训队]数颜色 / 维护队列
    [SP3267]DQUERY
    扩展欧几里得算法详解(exgcd)
    [CTSC2018]混合果汁
    极角排序那些事
    向量的点乘与叉乘学习笔记
    [APIO2014]序列分割
    CF1148D-Dirty Deeds Done Dirt Cheap
    CF176E Archaeology(set用法提示)
    【网络流24题】最长不下降子序列问题
  • 原文地址:https://www.cnblogs.com/sun2020/p/13961554.html
Copyright © 2011-2022 走看看