2023-06-19实习笔记

117 阅读6分钟

1.SpringBoot整合Email 邮件发送

  • 一.准备
  • 二.邮件发送需要的配置
    • 获取163邮箱授权码
    • 获取QQ邮箱授权码
    • YML配置
  • 三.代码编写
    • 普通邮件发送
    • HTML邮件发送
    • 含静态资源邮件发送
    • 带附件邮件发送

SpringBoot整合Email 邮件发送 在开发中,经常会碰到email邮件发送的场景 如发送验证码,向客户发送邮件等等。 今天,本项目将讲解通过Springboot 发送email 邮件 普通文本邮件 ,HTML内容板式邮件 ,包含静态资源邮件,以及带附件邮件。

一.准备 引入Maven依赖,同时需要常用的Spirngboot容器,这里我选择最常用的Spirngboot-starter-web做测试

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

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>

二.邮件发送需要的配置 因为各大邮件都有其对应安全系统,不是项目中想用就可以用的,我们必须要拿到其对应的客户端授权码才行,拿到授权码,在项目中配置SMTP服务协议以及主机 配置账户 ,就可以在项目中使用各大邮件运营商进行发送邮件了

获取客户端授权码过程

由于国内使用163邮箱以及qq邮箱较多 所以本文中仅仅展示这两个运营商获取客户端授权码的步骤

获取163邮箱授权码 登陆163邮箱 查看勾选服务是否开启,如未开启则勾选

Clipboard_2023-06-19-16-20-38.png

因为我在做本项目是已经是开启了,所以这里是叫我重置客户端授权码了 Clipboard_2023-06-19-16-21-00.png

在未设置授权码时 点击此页面回叫你使用当前邮箱账号绑定的手机号 发送一条短信确认 发送后,确认成功后,便可自定义163邮箱的客户端授权码了 Clipboard_2023-06-19-16-21-22.png

获取QQ邮箱授权码 登陆qq邮箱后,点击设置 选择 账户选项

Clipboard_2023-06-19-16-21-42.png

向下拉选择开启POP3/SMTP 服务 Clipboard_2023-06-19-16-21-52.png

点击开启也会进入验证 验证成功后即可看到自己qq邮箱的客户端授权码了 Clipboard_2023-06-19-16-22-03.png

我们在拿到授权码后,就可以在我们Springboot工程中的配置文件 aplication.yml 或者properties文件中配置了

YML配置

#spring.mail
spring.mail.host=smtp.exmail.qq.com
spring.mail.port=465
spring.mail.username=developer@jiang.cn
spring.mail.password=mrjiang
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.ssl.enable=true

三.代码编写

下面开始Springboot项目中发送邮件的代码编写

其实也非常简单 ,Springboot已经给我们邮件发送进行了非常好的整合了,我们只需要注入邮件发送接口 调用其中的方法,就能轻松而愉悦的进行邮件发送了!

我们只需要在任意交由Spring管理的类(例如你的service层等)下注入以下接口即可

  @Autowired
  private JavaMailSender mailSender;

由于每一封邮件都有固定的内容 例如 收件人信息 邮件内容 邮件标题 那么我们充分利用java面向对象的特性,我们吧邮件发送抽取为一个对象

代码采用了lombok进行简化

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ToEmail implements Serializable {

  /**
   * 邮件接收方,可多人
   */
  private String[] tos;
  /**
   * 邮件主题
   */
  private String subject;
  /**
   * 邮件内容
   */
  private String content;
}

肯定有人纳闷了,那么接收方有了,发送方呢?

发送一方,肯定就是我们自身拿到的授权码账号啊 ,我们获取账户客户端授权码其目的就是为了让代码代替我们自身邮箱 向其他邮箱发送信息而已。

获取发送方账户信息

  @Value("${spring.mail.username}")
  private String from;

统一说明: JsonReturn 为我项目自定义的Ajax 响应,结合 RestController 或者Responsebody向前端返回统一的JSON格式数据

普通邮件发送

public JsonReturn commonEmail(ToEmail toEmail) {
    //创建简单邮件消息
    SimpleMailMessage message = new SimpleMailMessage();
    //谁发的
    message.setFrom(from);
    //谁要接收
    message.setTo(toEmail.getTos());
    //邮件标题
    message.setSubject(toEmail.getSubject());
    //邮件内容
    message.setText(toEmail.getContent());
    try {
      mailSender.send(message);
      return JsonReturn.buildSuccess(toEmail.getTos(), "发送普通邮件成功");
    } catch (MailException e) {
      e.printStackTrace();
      return JsonReturn.buildFailure("普通邮件方失败");
    }

Clipboard_2023-06-19-16-36-44.png

Clipboard_2023-06-19-16-36-56.png 或许有人觉得 这样发送邮件 ,内容死板不好看啊,我想搞个有特色的的,搞个有样式的邮件,那么,下边就轮到HTML邮件出场了。

HTML邮件发送

  public JsonReturn htmlEmail(ToEmail toEmail) throws MessagingException {
    //创建一个MINE消息
    MimeMessage message = mailSender.createMimeMessage();
    MimeMessageHelper minehelper = new MimeMessageHelper(message, true);
    //谁发
    minehelper.setFrom(from);
    //谁要接收
    minehelper.setTo(toEmail.getTos());
    //邮件主题
    minehelper.setSubject(toEmail.getSubject());
    //邮件内容   true 表示带有附件或html
    minehelper.setText(toEmail.getContent(), true);
    try {
      mailSender.send(message);
      return JsonReturn.buildSuccess(toEmail.getTos() + toEmail.getContent(), "HTML邮件成功");
    } catch (MailException e) {
      e.printStackTrace();
      return JsonReturn.buildFailure("HTML邮件失败");
    }
  }

由于html格式不好编写,我直接使用Springboot测试类了

    @Test
    public void testHtml() throws Exception {
        String content = "<html>\n" +
            "<body>\n" +
            "    <h1>这是Html格式邮件!,不信你看邮件,我字体比一般字体还要大</h1>\n" +
            "</body>\n" +
            "</html>";
        toEmailService.htmlEmail(new ToEmail(new String[]{"248721866@qq.com"},"Html邮件",content));
    }

Clipboard_2023-06-19-16-38-35.png 有的人还喜欢在邮件中添加一些图片,让图片作为邮件内容 ,,这也是可以的

含静态资源邮件发送 我这里只是列举了发送一张图片,如需发送多张,修改修改其中一点方法即可,代码注释的非常详细了

public JsonReturn staticEmail(ToEmail toEmail, MultipartFile multipartFile, String resId) {
    //创建一个MINE消息
    MimeMessage message = mailSender.createMimeMessage();
    try {
      MimeMessageHelper helper = new MimeMessageHelper(message, true);
      //谁发
      helper.setFrom(from);
      //谁接收
      helper.setTo(toEmail.getTos());
      //邮件主题
      helper.setSubject(toEmail.getSubject());
      //邮件内容   true 表示带有附件或html
      //邮件内容拼接
      String content =
          "<html><body><img width='250px' src=\'cid:" + resId + "\'>" + toEmail.getContent()
              + "</body></html>";
      helper.setText(content, true);
      //蒋 multpartfile 转为file
      File multipartFileToFile = MultipartFileToFile(multipartFile);
      FileSystemResource res = new FileSystemResource(multipartFileToFile);

      //添加内联资源,一个id对应一个资源,最终通过id来找到该资源
      helper.addInline(resId, res);
      mailSender.send(message);
      return JsonReturn.buildSuccess(toEmail.getTos() + toEmail.getContent(), "嵌入静态资源的邮件已经发送");
    } catch (MessagingException e) {
      return JsonReturn.buildFailure("嵌入静态资源的邮件发送失败");
    }
  }

因为我当前没有使用文件服务器嘛,并未使用文件上传的URL 而是直接向接口传的multipartFile文件对象,但是邮件需要的是File对象,所以我们这里需要将multipartFile 转为 File

将 multpartfile 转为file

private File MultipartFileToFile(MultipartFile multiFile) {
    // 获取文件名
    String fileName = multiFile.getOriginalFilename();
    // 获取文件后缀
    String prefix = fileName.substring(fileName.lastIndexOf("."));
    // 若需要防止生成的临时文件重复,可以在文件名后添加随机码

    try {
      File file = File.createTempFile(fileName, prefix);
      multiFile.transferTo(file);
      return file;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }

Clipboard_2023-06-19-16-40-04.png

Clipboard_2023-06-19-16-39-54.png

Clipboard_2023-06-19-16-39-59.png

带附件邮件发送 很多时候,我们在发送邮件的时候,需要携带一些附件一起发送,那么JavaMailSender 中呢,也是有携带附件的方法的

    public JsonReturn enclosureEmail(ToEmail toEmail, MultipartFile multipartFile) {
        //创建一个MINE消息
        MimeMessage message = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            //谁发
            helper.setFrom(from);
            //谁接收
            helper.setTo(toEmail.getTos());
            //邮件主题
            helper.setSubject(toEmail.getSubject());
            //邮件内容   true 表示带有附件或html
            helper.setText(toEmail.getContent(), true);
            File multipartFileToFile = MultipartFileToFile(multipartFile);
            FileSystemResource file = new FileSystemResource(multipartFileToFile);
            String filename = file.getFilename();
            //添加附件
            helper.addAttachment(filename, file);
            mailSender.send(message);
            return JsonReturn.buildSuccess(toEmail.getTos() + toEmail.getContent(), "附件邮件成功");
        } catch (MessagingException e) {
            e.printStackTrace();
            return JsonReturn.buildFailure("附件邮件发送失败" + e.getMessage());
        }
    }

Clipboard_2023-06-19-16-40-59.png

Clipboard_2023-06-19-16-40-48.png

Clipboard_2023-06-19-16-40-55.png

我个人实现的简单普通邮件发送案例可以分为以下三个步骤:

1.导入依赖包 2.配置application.properties文件

#spring.mail
spring.mail.host=smtp.exmail.qq.com
spring.mail.port=465
spring.mail.username=developer@snsports.cn
spring.mail.password=Only4HeheAdmin
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.ssl.enable=true

以目前我实习公司为例

3.发送简单邮件

            SimpleMailMessage message = new SimpleMailMessage();
            message.setFrom("developer@snsports.cn");
            message.setTo("554147480@qq.com");
            message.setSubject("Test Mail");
            message.setText("Hello, this is a test mail!");
            javaMailSender.send(message);