Java发送邮件 SpringBoot

本文详细介绍了如何在SpringBoot应用中配置和使用Java发送邮件,包括SMTP服务器设置、邮件内容配置以及发送带附件、抄送等功能的实现。
摘要由CSDN通过智能技术生成

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"。
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
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.3</version>
    <relativePath/>
</parent>
邮件配置说明
<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方法

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

实现类

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

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

// 因为要设置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对象,可能在代码的其他地方定义。
@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);

@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对象,可能在代码的其他地方定义。
@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层

@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对象,可能在代码的其他地方定义。
/**
 * 发送富文本邮件
 *
 * @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层

@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的数组,或者是单个。

/**
 * 发送带抄送的邮件
 *
 * @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);
}
  • 16
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
重置密码邮件是一个在Spring Boot应用程序中实现的功能,用于用户忘记密码时通过电子邮件来重置密码。根据引用中的描述,实现重置密码邮件的过程可以分为以下步骤: 1. 用户申请重置邮件:用户在页面中输入邮箱,服务器检查是否允许重置,包括检查邮箱所指向的用户是否存在、重置是否过于频繁以及重置是否达到日请求上限。 2. 验证通过后,向表中写入申请记录,包含token、用户邮箱和id。然后发送包含带有token的链接的邮件给用户。 3. 用户点击邮件中的链接,跳转到新密码输入网页,并提交重置密码请求(POST请求中包含token和新密码)。 4. 服务器验证token的有效性,检查token是否过期以及该用户是否发起过其他新的token。 5. 通过验证表中的记录查找用户id,并修改用户密码。 根据引用中的描述,开发环境使用的是Spring Boot 1.5.16.RELEASE。为了实现重置密码邮件功能,你需要在pom.xml文件中添加邮件依赖,如下所示: ```xml <!-- 邮件: email --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> ``` 另外,你还需要添加pm_validate表的结构来存储验证记录。 综上所述,通过以上步骤和依赖,你可以在Spring Boot应用程序中实现重置密码邮件功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringBoot-Web-Mvc-Security:以Spring方式构建企业Java应用程序](https://download.csdn.net/download/weixin_42110038/14968243)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [[Springboot]发送邮件、重置密码业务实战](https://blog.csdn.net/qqxx6661/article/details/87352041)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值