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

  • 相关阅读:
    PAT顶级 1015 Letter-moving Game (35分)
    PAT顶级 1008 Airline Routes (35分)(有向图的强连通分量)
    PAT顶级 1025 Keep at Most 100 Characters (35分)
    PAT顶级 1027 Larry and Inversions (35分)(树状数组)
    PAT 顶级 1026 String of Colorful Beads (35分)(尺取法)
    PAT顶级 1009 Triple Inversions (35分)(树状数组)
    Codeforces 1283F DIY Garland
    Codeforces Round #438 A. Bark to Unlock
    Codeforces Round #437 E. Buy Low Sell High
    Codeforces Round #437 C. Ordering Pizza
  • 原文地址:https://www.cnblogs.com/sun2020/p/13961554.html
Copyright © 2011-2022 走看看