目录

一、QQ 邮箱授权码设置

二、Spring Boot 配置 QQ 邮箱

三、实现邮件发送服务

四、全局异常处理发送邮件通知

五、测试邮件发送

六、常见问题排查


        在开发中,我们经常需要通过邮件发送通知,例如程序异常、注册验证等。本文将介绍如何使用 Spring Boot 配置 QQ 邮箱进行邮件发送,并通过全局异常处理实现自动邮件通知功能。

一、QQ 邮箱授权码设置

1. 开启 SMTP 服务
  • 登录你的 QQ 邮箱,进入邮箱主页。
  • 依次点击:设置 -> 账户 -> 开启 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 服务
  • 在 SMTP 服务 选项中,选择“开启”。
2. 获取授权码
  • 在开启 SMTP 服务后,QQ 邮箱会提示你获取授权码。
  • 点击“生成授权码”,按照提示通过手机验证码验证身份。
  • QQ 邮箱会生成一串授权码(类似:jqrbqmjopywigahi),并将其显示给你。

⚠️ 注意
该授权码用于登录邮件服务器,不是你 QQ 邮箱的登录密码。
请妥善保管授权码,避免泄露。


二、Spring Boot 配置 QQ 邮箱

1. 添加依赖

pom.xml 文件中引入 Spring Boot 邮件相关依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2. 配置邮件参数

application.yml 中设置 QQ 邮箱参数:

spring:
  mail:
    host: smtp.qq.com             # QQ 邮箱 SMTP 服务器地址
    port: 465                     # QQ 邮箱 SMTP 服务端口(465 - SSL 加密端口)
    username: ***********         # 发件人邮箱地址
    password: ***********         # 授权码(非邮箱密码)
    protocol: smtp
    default-encoding: UTF-8
    properties:
      mail:
        smtp:
          auth: true              # 需要验证身份
          starttls:
            enable: true
            required: true
          ssl:
            enable: true          # 启用 SSL 加密
3. 验证配置

完成配置后,可以进行邮件发送测试,确保配置正确。


三、实现邮件发送服务

1. 定义邮件实体类
public class MyEmail {
    private String to;         // 收件人
    private String subject;    // 邮件主题
    private String content;    // 邮件内容
    private String attachment; // 附件(可选)

    // Getters 和 Setters
}
2. 创建邮件服务接口
public interface EmailService {
    boolean checkEmail(MyEmail email);  // 校验邮件参数
    void sendEmail(MyEmail email);      // 发送邮件
}
3. 实现邮件发送逻辑
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import java.util.Date;

@Service
public class EmailServiceImpl implements EmailService {

    @Autowired
    private JavaMailSender mailSender;

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

    @Override
    public boolean checkEmail(MyEmail email) {
        if (email.getTo() == null || email.getTo().isEmpty()) {
            System.out.println("邮件收件人不能为空");
            return false;
        }
        if (email.getSubject() == null || email.getSubject().isEmpty()) {
            System.out.println("邮件主题不能为空");
            return false;
        }
        if (email.getContent() == null || email.getContent().isEmpty()) {
            System.out.println("邮件内容不能为空");
            return false;
        }
        return true;
    }

    @Override
    public void sendEmail(MyEmail email) {
        try {
            MimeMessageHelper helper = new MimeMessageHelper(mailSender.createMimeMessage(), true);
            helper.setFrom(sender);
            helper.setTo(email.getTo());
            helper.setSubject(email.getSubject());
            helper.setText(email.getContent(), true);  // true 表示支持 HTML 格式

            if (email.getAttachment() != null) {
                helper.addAttachment("附件", new ByteArrayResource(email.getAttachment().getBytes()));
            }

            helper.setSentDate(new Date());
            mailSender.send(helper.getMimeMessage());
            System.out.println("邮件发送成功!");
        } catch (MessagingException e) {
            e.printStackTrace();
            System.out.println("邮件发送失败:" + e.getMessage());
        }
    }
}

四、全局异常处理发送邮件通知

1. 创建全局异常处理类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @Autowired
    private EmailService emailService;

    @ExceptionHandler(RuntimeException.class)
    public String handleRuntimeException(RuntimeException e) {
        e.printStackTrace();

        // 邮件内容
        MyEmail email = new MyEmail();
        email.setTo("admin@example.com");  // 管理员邮箱
        email.setSubject("程序异常通知");
        email.setContent(
                "<h1>程序异常,请尽快处理!</h1>" +
                "<p style='color:red;'>异常信息:" + e.getMessage() + "</p>" +
                "<p>请点击下方链接确认收到通知:</p>" +
                "<a href='http://localhost:8080/confirm'>确认链接</a>"
        );

        // 发送邮件
        emailService.sendEmail(email);

        return "程序异常,已发送邮件通知管理员";
    }
}

五、测试邮件发送

  1. 启动 Spring Boot 项目。
  2. 访问触发异常的接口,查看控制台输出。
  3. 检查管理员邮箱,确认是否收到异常通知邮件。

发送效果如下:


六、常见问题排查

1. 邮件发送失败
  • 确保授权码正确,且 SMTP 服务已开启。
  • 检查端口配置:QQ 邮箱使用 465(SSL) 或 587(STARTTLS)。
  • 确保应用程序可以访问外网。
2. 发送 HTML 格式邮件
  • MimeMessageHelpersetText 方法第二个参数传 true,表示支持 HTML 格式。
3. 邮件被拦截或标记为垃圾邮件
  • 尽量避免邮件内容包含敏感词汇。
  • 使用可信任的发件人邮箱和主题。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐