使用 Hutool 工具实现邮件发送功能详解

目录

  • 1.需求分析
  • 2.准备工作:开通邮箱的 SMTP 服务
  • 3.项目环境搭建
  • 4.代码实现
  • 4.1.mail.html
  • 4.2.Employee.java
  • 4.3.MailController.java
  • 4.4.MailService.java
  • 4.5.MailServiceImpl.java
  • 5.测试
  • 6.扩展:自定义邮件服务器
  • 1.需求分析

    采用 Hutool 工具来实现发送邮件的功能,具体来说:为新员工发送一封入职欢迎邮件,在发送邮件时,需要先将新员工的相关信息(例如姓名、职位、职称、部门)设置到 HTML 模板中,然后再进行发送。

    Hutool 工具中发送邮件的相关文档见邮件工具-MailUtil。

    2.准备工作:开通邮箱的 SMTP 服务

    (1)本文以 163 邮箱为例,先注册 163 邮箱,登录 163 邮箱后,开通邮箱的 SMTP 服务,具体步骤如下所示:

    需要根据注册时的手机号发送的验证码来开通获取邮箱客户端授权码。开通成功后,会显示个人授权码(如下图所示),该授权码是后面通过 Java 发送邮件的认证密码,非常重要!

    3.项目环境搭建

    (1)在 IDEA 中创建一个 Spring Boot 项目,具体可以参考【环境搭建】使用IDEA创建SpringBoot项目详细步骤这篇文章。

    (2)pom.xml 中添加如下依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    
    <!-- com.sun.mail 是 javax.mail 升级后的版本,新版本包名做了变更-->
    <dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
        <version>1.6.2</version>
    </dependency>
    
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
    </dependency>
    

    (3)在 classpath(在标准 Maven 项目中为 src/main/resources)的 config 目录下新建 mail.setting 文件,里面设置相关的邮件配置:

    # 邮件服务器的 SMTP 地址,可选,默认为 smtp.<发件人邮箱后缀>
    host = smtp.163.com
    # 邮件服务器的 SMTP 端口,可选,默认 25
    port = 25
    # 发件人(必须正确,否则发送失败)
    from = xxx@163.com
    # 用户名,默认为发件人邮箱前缀
    user = xxx
    # 密码(注意,某些邮箱需要为 SMTP 服务单独设置授权码,此处填上面获取到的授权码)
    pass = xxx
    

    注意:除了使用上述配置方式外,我们也可以在 Spring Boot 的配置文件(例如 application.yml)中进行邮件配置,然后在发送邮件时进行读取即可。使用上述方式的好处在于免去了读取这一步骤。

    4.代码实现

    4.1.mail.html

    邮件模板 mail.html 如下:

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
        <head>
            <meta charset="UTF-8">
            <title>入职欢迎邮件</title>
        </head>
        <body>
          欢迎 <span th:text="${name}"></span> 加入 XXXX 大家庭,您的入职信息如下:
          <table border="1">
              <tr>
                  <td>姓名</td>
                  <td th:text="${name}"></td>
              </tr>
              <tr>
                  <td>职位</td>
                  <td th:text="${posName}"></td>
              </tr>
              <tr>
                  <td>职称</td>
                  <td th:text="${jobLevelName}"></td>
              </tr>
              <tr>
                  <td>部门</td>
                  <td th:text="${departmentName}"></td>
              </tr>
          </table>
          <p>我们公司的工作忠旨是严格,创新,诚信,您的加入将为我们带来新鲜的血液,带来创新的思维,
            以及为我们树立良好的公司形象!希望在以后的工作中我们能够齐心协力,与时俱进,团结协作!
            同时也祝您在本公司,工作愉快,实现自己的人生价值!希望在未来的日子里,携手共进!</p>
        </body>
    </html>
    

    4.2.Employee.java

    员工实体类 Employee.java 如下:

    package com.example.mailsend.entity;
    
    import lombok.Data;
    
    @Data
    public class Employee {
    
        private String name;
    
        private String posName;
    
        private String jobLevelName;
    
        private String departmentName;
    
        private String mail;
    
    }
    

    4.3.MailController.java

    package com.example.mailsend.controller;
    
    import com.example.mailsend.entity.Employee;
    import com.example.mailsend.service.MailService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/mail")
    public class MailController {
    
        @Autowired
        private MailService mailService;
    
        @PostMapping("/send")
        public String sendMail(@RequestBody Employee employee) {
            mailService.sendMail(employee);
            return "success";
        }
    }
    

    4.4.MailService.java

    package com.example.mailsend.service;
    
    import com.example.mailsend.entity.Employee;
    
    public interface MailService {
    
        void sendMail(Employee employee);
    
    }
    

    4.5.MailServiceImpl.java

    package com.example.mailsend.service.impl;
    
    import cn.hutool.extra.mail.MailUtil;
    import com.example.mailsend.entity.Employee;
    import com.example.mailsend.service.MailService;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.thymeleaf.TemplateEngine;
    import org.thymeleaf.context.Context;
    
    @Slf4j
    @Service
    public class MailServiceImpl implements MailService {
    
        @Autowired
        private TemplateEngine templateEngine;
    
        @Override
        public void sendMail(Employee employee) {
    
            /**
             * Thymeleaf 模板引擎通过 Context 对象与数据进行绑定,将模板中的表达式与 Context 中的数据关联起来,
             * 在模板中可以直接引用 Context 中存储的数据,以便动态生成页面内容。
             * */
            Context context = new Context();
            context.setVariable("name", employee.getName());
            context.setVariable("posName", employee.getPosName());
            context.setVariable("jobLevelName", employee.getJobLevelName());
            context.setVariable("departmentName", employee.getDepartmentName());
    
            //收件人邮箱
            String to = employee.getMail();
            //邮件主题
            String subject = "欢迎入职";
            //邮件内容
            String htmlContent = templateEngine.process("mail", context);
            //邮件内容是否是 HTML 格式
            boolean isHtml = true;
            //此处的 to 是字符串(表示收件人的邮箱),此外也可以传入 list 集合(即多个收件人的邮箱)
            MailUtil.send(to, subject, htmlContent, isHtml);
        }
    }
    

    5.测试

    启动项目后,在 Postman 中进行接口测试(注意是 POST 请求),根并在请求体中设置员工的相关信息(重点是员工邮箱):

    http://localhost:8080/mail/send
    
    {
        "name" : "Tom",
        "posName": "软件开发工程师",
        "jobLevelName" : "高级",
        "departmentName": "软件开发部",
        "mail": "xxx@qq.com"
    }
    

    运行成功后会发现员工邮箱已经受到的对应的邮件:

    6.扩展:自定义邮件服务器

    (1)除了使用配置文件定义全局账号以外,MailUtil.send 方法同时提供重载方法可以传入一个 MailAccount 对象,这个对象为一个普通 Bean,记录了邮件服务器信息。示例代码如下所示:

    MailAccount account = new MailAccount();
    account.setHost("smtp.yeah.net");
    account.setPort("25");
    account.setAuth(true);
    account.setFrom("hutool@yeah.net");
    account.setUser("hutool");
    account.setPass("q1w2e3");
    
    MailUtil.send(account, CollUtil.newArrayList("hutool@foxmail.com"), "测试", "邮件来自Hutool测试", false);
    

    (2)其中,MailAccount 对象中的邮箱服务器信息可以也可以从配置文件 application.yml 中动态获取:

    mail:
      host: smtp.yeah.net
      port: 25
      from: hutool@yeah.net
      username: hutool
      password: q1w2e3
    
    @Value("${spring.mail.host}")
    private String host;
    
    @Value("${mail.port}")
    private Integer port;
    
    @Value("${mail.from}")
    private String from;
    
    @Value("${mail.username}")
    private String username;
    
    @Value("${mail.password}")
    private String password;
    
    private MailAccount getMailAccount() {
    	MailAccount account = new MailAccount();
    	account.setHost(host);
    	account.setPort(port);
    	account.setAuth(true);
    	account.setFrom(from);
    	account.setUser(username);
    	account.setPass(password);
    	return account;
    }
    

    作者:代码星辰

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用 Hutool 工具实现邮件发送功能详解

    发表回复