SpringBoot整合Email 邮件发送


SpringBoot整合Email 邮件发送

在开发中,经常会碰到email邮件发送的场景 如发送验证码,向客户发送邮件等等。

今天,本项目将讲解通过Springboot 发送email 邮件 普通文本邮件 ,HTML内容板式邮件 ,包含静态资源邮件,以及带附件邮件。

一.准备

在创建SpringBoot项目 选择依赖时 发现其选择依赖时有邮件发送与Springboot整合的jar包,我们勾选即可
在这里插入图片描述

如果未勾选也不要紧,咱们手动导入

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

本项目是基于页面测试的,所以我又引入了相关web依赖 ,简化实体类代码引入了lombok依赖

    <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邮箱
查看勾选服务是否开启,如未开启则勾选
在这里插入图片描述
因为我在做本项目是已经是开启了,所以这里是叫我重置客户端授权码了
在这里插入图片描述
在未设置授权码时 点击此页面回叫你使用当前邮箱账号绑定的手机号 发送一条短信确认
发送后,确认成功后,便可自定义163邮箱的客户端授权码了
在这里插入图片描述
·····

获取QQ邮箱授权码

登陆qq邮箱后,点击设置 选择 账户选项
在这里插入图片描述
向下拉选择开启POP3/SMTP 服务
在这里插入图片描述
点击开启也会进入验证 验证成功后即可看到自己qq邮箱的客户端授权码了
在这里插入图片描述
在这里插入图片描述
······

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

YML配置
spring:
  mail:
    #smtp服务主机  qq邮箱则为smtp.qq.com
    host: smtp.163.com
    #服务协议
    protocol: smtp
    # 编码集
    default-encoding: UTF-8
    #发送邮件的账户
    username: xxxxxxx@163.com
    #授权码
    password: xxxxxx
    test-connection: true
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: 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("普通邮件方失败");
    }

在这里插入图片描述
在这里插入图片描述
或许有人觉得 这样发送邮件 ,内容死板不好看啊,我想搞个有特色的的,搞个有样式的邮件,那么,下边就轮到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));
    }

在这里插入图片描述
有的人还喜欢在邮件中添加一些图片,让图片作为邮件内容 ,,这也是可以的

含静态资源邮件发送

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

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;
  }

在这里插入图片描述
注意还要传一个静态文件,我这里传一个图片,POSTMAN 传文件方法如下
在这里插入图片描述
在这里插入图片描述
发附件需要注意的是一个静态资源要对应一个ID ,ID没有讲究 别重复了就行

带附件邮件发送

很多时候,我们在发送邮件的时候,需要携带一些附件一起发送,那么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());
        }
    }

在这里插入图片描述
在这里插入图片描述
ok,一套打完收工,本次SpringBoot 整合email 邮件发送到这里就完了,一般项目中的使用也基本够用了,哈哈。
项目源码:SpringBoot整合Email 邮件发送

  • 84
    点赞
  • 390
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
Spring Boot整合发送邮件可以使用 JavaMailSender 接口来实现。下面是一个简单的示例代码: 首先,确保在你的项目的 pom.xml 文件中添加了 Spring Boot 邮件依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> ``` 然后,在你的 application.properties 或 application.yml 文件中配置邮件相关的属性: ```properties # 邮件发送服务器主机名 spring.mail.host=your-smtp-server # 邮件发送服务器端口号 spring.mail.port=your-smtp-port # 邮件发送服务器用户名 spring.mail.username=your-username # 邮件发送服务器密码 spring.mail.password=your-password # 是否启用 SSL/TLS 安全连接 spring.mail.properties.mail.smtp.starttls.enable=true ``` 接下来,创建一个邮件服务类,用于发送邮件: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Service; @Service public class EmailService { @Autowired private JavaMailSender javaMailSender; public void sendEmail(String to, String subject, String text) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(to); message.setSubject(subject); message.setText(text); javaMailSender.send(message); } } ``` 最后,在你的控制器或其他地方调用邮件服务类的 sendEmail 方法发送邮件: ```java import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class EmailController { @Autowired private EmailService emailService; @GetMapping("/send-email") public String sendEmail() { String to = "[email protected]"; String subject = "Test Email"; String text = "This is a test email sent from Spring Boot."; emailService.sendEmail(to, subject, text); return "Email sent successfully"; } } ``` 这样,当你访问 `/send-email` 路径时,就会发送一封测试邮件到指定的收件人邮箱。你可以根据实际需求修改相应的参数和邮件内容。记得将 `your-smtp-server`、`your-smtp-port`、`your-username` 和 `your-password` 替换为你的邮件服务器和账户信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值