Java发送邮件 SpringBoot

Java发送邮件 SpringBoot

配置和目录结构

配置预览

  1. spring.application.name:设置应用程序的名称为"demo-mail"。
  2. spring.mail.host:设置SMTP服务器的地址为"smtp.qq.com",这是QQ邮箱的SMTP服务器地址。
  3. spring.mail.port:设置SMTP服务器的端口号为465,这是QQ邮箱的SMTP服务器端口号。
  4. spring.mail.username:设置发送邮件的邮箱地址为"3324855376@qq.com",这是发送邮件的QQ邮箱地址。
  5. spring.mail.password:设置发送邮件的邮箱密码为"axyqbvfuxkdqdaai",这是发送邮件的QQ邮箱密码。注意,如果密码是纯数字,需要将其用引号括起来。
  6. spring.mail.default-encoding:设置邮件的默认编码格式为UTF-8。
  7. spring.mail.properties.mail.debug:设置是否开启debug模式发送邮件,这里设置为true,表示开启debug模式。
  8. spring.mail.properties.smtp.connectionTimeout:设置连接延迟时间为5000毫秒。
  9. spring.mail.properties.smtp.timeout:设置延迟时间为5000毫秒。
  10. spring.mail.properties.smtp.writeTimeout:设置写入邮箱延迟时间为5000毫秒。
  11. spring.mail.properties.smtp.allow8BitMime:设置是否允许8位编码的MIME。
  12. spring.mail.properties.smtp.sendPartial:设置是否发送部分内容。
  13. spring.mail.properties.smtp.ssl.enabled:设置是否开启SSL连接,这里设置为true,表示开启SSL连接。
  14. spring.mail.properties.smtp.socketFactory.class:设置SSL连接时的SocketFactory类为"javax.net.ssl.SSLSocketFactory"。
yml 复制代码
spring:
  application:
    name: demo-mail
  mail:
    host: smtp.qq.com # 邮箱地址
    port: 465 # 邮箱端口号
    username: 3324855376@qq.com # 设置发送邮箱
    password: axyqbvfuxkdqdaai # 如果是纯数字要加引号
    default-encoding: UTF-8 # 设置编码格式
    properties:
      mail:
        debug: true # 是否开启debug模式发送邮件
        smtp:
          connectionTimeout: 5000 # 设置连接延迟
          timeout: 5000 # 延迟时间
          writeTimeout: 5000 # 写入邮箱延迟
          allow8BitMime: true
          sendPartial: true
          ssl:
            enabled: true # 是否开启SSL连接
          socketFactory:
            class: javax.net.ssl.SSLSocketFactory # 必要设置!!!

可以设置发送邮件debug模式这样在发送时可以在控制台中输出相关信息。

目录结构

需要导入的包

SpringBoot版本为3.2.3
java 复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.3</version>
    <relativePath/>
</parent>
邮件配置说明
xml 复制代码
<dependencies>
    <!-- 邮箱 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>

    <!-- knife4j -->
    <dependency>
        <groupId>com.github.xiaoymin</groupId>
        <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
        <version>4.4.0</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba.fastjson2</groupId>
        <artifactId>fastjson2</artifactId>
        <version>2.0.47</version>
    </dependency>
</dependencies>

发送简单邮件

Controller层

在服务中调用sendSimpleEmail方法

java 复制代码
@RestController
@RequiredArgsConstructor
@RequestMapping("/email")
@Tag(name = "邮箱发送接口", description = "邮箱发送接口")
@Slf4j
public class EmailController {
    private final EmailService emailService;

    @Operation(summary = "发送简单邮件", description = "发送简单邮件")
    @PostMapping("/send-text")
    public void sendText(@RequestBody EmailSend emailSend) {
        log.info("发送简单邮件");
        emailService.sendSimpleEmail(emailSend);
    }
}

实现类

因为要保持配置中的发件人和邮箱中发件人是同一个,所以在上面直接读取配置文件中的发件人,这样也比较灵活点。

如果不知道配置文件内容请看上面部分。

xml 复制代码
// 因为要设置setFrom邮箱,但是又和配置邮箱username相同所以采取读取配置文件方式
@Value("${spring.mail.username}")
private String emailFrom;
实现方法
  1. SimpleMailMessage对象mailMessage,用于设置邮件的各个属性。
  2. mailMessage.setFrom(emailFrom)设置邮件发送人,其中emailFrom是发送人的地址,在配置文件中已经定义
  3. mailMessage.setTo(emailSend.getSendTo())设置邮件接收者,其中emailSend.getSendTo()设置了邮件接收者的地址。
  4. mailMessage.setSubject(emailSend.getSubject())设置邮件主题,其中emailSend.getSubject()获取了邮件的主题。
  5. mailMessage.setText(emailSend.getMessage())设置邮件消息内容,其中emailSend.getMessage()获取了邮件的消息内容。
  6. 调用javaMailSender.send(mailMessage)发送邮件,javaMailSender是一个JavaMailSender对象,可能在代码的其他地方定义。
java 复制代码
@Service
@RequiredArgsConstructor
public class EmailServiceImpl implements EmailService {
    private final JavaMailSender javaMailSender;

    // 因为要设置setFrom邮箱,但是又和配置邮箱username相同所以采取读取配置文件方式
    @Value("${spring.mail.username}")
    private String emailFrom;

    /**
     * 发送邮件-简单
     *
     * @param emailSend 邮件消息
     */
    @Override
    public void sendSimpleEmail(EmailSend emailSend) {
        // 创建邮件消息体 SimpleMailMessage 发送简单邮件
        SimpleMailMessage mailMessage = new SimpleMailMessage();

        // 设置邮件发送人
        mailMessage.setFrom(emailFrom);
        // 设置邮件接受者
        mailMessage.setTo(emailSend.getSendTo());
        // 设置邮件主题
        mailMessage.setSubject(emailSend.getSubject());
        // 设置邮件消息
        mailMessage.setText(emailSend.getMessage());

        // 发送邮件
        javaMailSender.send(mailMessage);
    }
}
调试方法

发送带附件邮件

需要注意,附件可以发送多个,在下文中也会说到。

发送注意点

因为在SpringBoot中只能有一个请求体@RequestBody所以在发送时,要想实现这个格式有两种方式。

  1. 如果想要两个一起用需要将JSON对象当成字符串发送之后在后端解析@RequestBody MultipartFile file, @RequestParam String emailSend
  2. 如果就是将EmailSend对象拆成一个一个字段进行解析

在这我还是觉得当成整个文本解析比较好,所以就采取了解析整个字段方式,之后使用JSON转换下即可。

Controller层

直接调用实现类中方法即可sendAttachmentEmail()

在这里将字符串解析成JSONEmailSend send = JSON.parseObject(emailSend, EmailSend.class);

java 复制代码
@RestController
@RequiredArgsConstructor
@RequestMapping("/email")
@Tag(name = "邮箱发送接口", description = "邮箱发送接口")
@Slf4j
public class EmailController {
    private final EmailService emailService;

    @Operation(summary = "发送带附件邮件", description = "发送带附件邮件")
    @PostMapping("send-attachment")
    public String sendAttachment(@RequestBody MultipartFile file, @RequestParam String emailSend) {
        log.info("发送带附件邮件");
        try {
            EmailSend send = JSON.parseObject(emailSend, EmailSend.class);
            emailService.sendAttachmentEmail(send, file);
            return "发送成功";
        } catch (MessagingException e) {
            return e.getMessage();
        }
    }
}

实现类

  • MimeMessage对象mailMessage,用于发送带附件或富文本内容的邮件。
  • MimeMessageHelper对象helper,用于设置邮件的各个属性和添加附件。
  • helper.setFrom(emailFrom)设置邮件发送人,其中emailFrom是发送人的地址,可能在代码的其他地方定义。
  • helper.setTo(emailSend.getSendTo())设置邮件接收者,其中emailSend.getSendTo()获取了邮件接收者的地址。
  • helper.setText(emailSend.getMessage())设置邮件消息内容,其中emailSend.getMessage()获取了邮件的消息内容。
  • helper.setSubject(emailSend.getSubject())设置邮件主题,其中emailSend.getSubject()获取了邮件的主题。
  • helper.addAttachment(Objects.requireNonNull(file.getOriginalFilename()), file)添加附件,其中file.getOriginalFilename()获取了附件的原始文件名,file表示要添加的附件文件。
  • 调用javaMailSender.send(mailMessage)发送邮件,javaMailSender是一个JavaMailSender对象,可能在代码的其他地方定义。
java 复制代码
@Service
@RequiredArgsConstructor
public class EmailServiceImpl2 implements EmailService {
    private final JavaMailSender javaMailSender;

    // 因为要设置setFrom邮箱,但是又和配置邮箱username相同所以采取读取配置文件方式
    @Value("${spring.mail.username}")
    private String emailFrom;

    /**
     * 发送带附件邮件
     *
     * @param emailSend 邮件消息
     */
    @Override
    public void sendAttachmentEmail(EmailSend emailSend, MultipartFile file) throws MessagingException {
        // 创建 MimeMessage 对象用户发送附件或者是富文本内容
        MimeMessage mailMessage = javaMailSender.createMimeMessage();
        // 创建 MimeMessageHelper
        MimeMessageHelper helper = new MimeMessageHelper(mailMessage, true);

        // 奢姿邮件发送人
        helper.setFrom(emailFrom);
        // 设置邮件接受者
        helper.setTo(emailSend.getSendTo());
        // 设置邮件消息
        helper.setText(emailSend.getMessage());
        // 设置邮件主题
        helper.setSubject(emailSend.getSubject());
        // 邮件添加附件
        helper.addAttachment(Objects.requireNonNull(file.getOriginalFilename()), file);

        // 发送邮件
        javaMailSender.send(mailMessage);
    }
}
发送多个附件

附件可以设置多个

发送富文本邮件

富文本其实就是HTML邮件,只要在发送邮件设置一个true即可。

helper.setText(emailSend.getMessage(), true);

message中设置HTML内容即可

Controller层

java 复制代码
@Operation(summary = "发送富文本邮件", description = "发送富文本邮件")
@PostMapping("send-rich")
public String sendRich(@RequestBody EmailSend emailSend) {
    log.info("发送富文本邮件");
    try {
        emailService.sendRich(emailSend);
        return "发送成功";
    } catch (MessagingException e) {
        return e.getMessage();
    }
}

实现类

  • MimeMessage对象message,用于发送富文本或附件的邮件。
  • MimeMessageHelper对象helper,用于设置邮件的各个属性和富文本内容。
  • helper.setFrom(emailFrom)设置邮件发送人,其中emailFrom是发送人的地址,可能在代码的其他地方定义。
  • helper.setTo(emailSend.getSendTo())设置邮件接收者,其中emailSend.getSendTo()获取了邮件接收者的地址。
  • helper.setSubject(emailSend.getSubject())设置邮件主题,其中emailSend.getSubject()获取了邮件的主题。
  • helper.setText(emailSend.getMessage(), true)设置邮件富文本内容,其中emailSend.getMessage()获取了邮件的富文本内容,第二个参数true表示以HTML格式发送邮件。
  • 调用javaMailSender.send(message)发送邮件,javaMailSender是一个JavaMailSender对象,可能在代码的其他地方定义。
java 复制代码
/**
 * 发送富文本邮件
 *
 * @param emailSend 邮件消息
 */
@Override
public void sendRich(EmailSend emailSend) throws MessagingException {
    // 创建 MimeMessage 对象用于发送邮件富文本或者附件
    MimeMessage message = javaMailSender.createMimeMessage();
    // 创建 MimeMessageHelper
    MimeMessageHelper helper = new MimeMessageHelper(message, true);

    // 设置邮件发送者
    helper.setFrom(emailFrom);
    // 设置邮件接受者
    helper.setTo(emailSend.getSendTo());
    // 设置邮件主题
    helper.setSubject(emailSend.getSubject());
    // 设置邮件富文本,后面跟true 表示HTML格式发送
    helper.setText(emailSend.getMessage(), true);

    // 发送邮件
    javaMailSender.send(message);
}

测试结果

带抄送邮件

调用helper.setCc()即可

Controller层

java 复制代码
@Operation(summary = "发送带抄送的邮件", description = "发送带抄送的邮件")
@PostMapping("send-cc")
public String sendCC(@RequestBody EmailSend emailSend, @RequestParam String ccParam) {
    log.info("发送带抄送的邮件");
    try {
        emailService.sendCC(emailSend, ccParam);
        return "发送成功";
    } catch (MessagingException e) {
        return e.getMessage();
    }
}

实现类

helper.setCc可以设置多个,需要传入string的数组,或者是单个。

java 复制代码
/**
 * 发送带抄送的邮件
 *
 * @param emailSend 邮件消息
 * @param ccParam   抄送人
 */
@Override
public void sendCC(EmailSend emailSend, String ccParam) throws MessagingException {
    // 创建 MimeMessage 对象用于发送邮件富文本或者附件
    MimeMessage message = javaMailSender.createMimeMessage();
    // 创建 MimeMessageHelper
    MimeMessageHelper helper = new MimeMessageHelper(message, true);

    // 设置发送人
    helper.setFrom(emailFrom);
    // 设置邮件接受者
    helper.setTo(emailSend.getSendTo());
    // 设置邮件主题
    helper.setSubject(emailSend.getSubject());
    // 设置发送消息 为富文本
    helper.setText(emailSend.getMessage(), true);
    // 设置抄送人
    helper.setCc(ccParam.split(","));

    // 发送邮件
    javaMailSender.send(message);
}
lper helper = new MimeMessageHelper(message, true);

    // 设置发送人
    helper.setFrom(emailFrom);
    // 设置邮件接受者
    helper.setTo(emailSend.getSendTo());
    // 设置邮件主题
    helper.setSubject(emailSend.getSubject());
    // 设置发送消息 为富文本
    helper.setText(emailSend.getMessage(), true);
    // 设置抄送人
    helper.setCc(ccParam.split(","));

    // 发送邮件
    javaMailSender.send(message);
}
相关推荐
IT学长编程3 分钟前
计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·玩具租赁系统
莹雨潇潇5 分钟前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
杨哥带你写代码24 分钟前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
XKSYA(小巢校长)42 分钟前
NatGo我的世界联机篇
开发语言·php
Cons.W1 小时前
Codeforces Round 975 (Div. 1) C. Tree Pruning
c语言·开发语言·剪枝
憧憬成为原神糕手1 小时前
c++_ 多态
开发语言·c++
VBA63371 小时前
VBA信息获取与处理第三个专题第三节:工作薄在空闲后自动关闭
开发语言
郭二哈1 小时前
C++——模板进阶、继承
java·服务器·c++
A尘埃1 小时前
SpringBoot的数据访问
java·spring boot·后端
yang-23071 小时前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端