springboot集成qq邮箱发送邮件

引入依赖:

<!-- JavaMail API -->
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.6.2</version>
</dependency>
<!-- JavaMail实现 -->
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

工具类:

package com.woniu.controller;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;


public class QQMailSender {

    // QQ邮箱SMTP服务器地址
    private static final String SMTP_HOST = "smtp.qq.com";
    // 端口号,SSL加密方式为465
    private static final String SMTP_PORT = "465";

    private String senderEmail;   // 发送者邮箱地址
    private String authCode;      // QQ邮箱授权码(不是登录密码)

    /**
     * 构造方法
     * @param senderEmail 发送者QQ邮箱
     * @param authCode 邮箱授权码
     */
    public QQMailSender(String senderEmail, String authCode) {
        this.senderEmail = senderEmail;
        this.authCode = authCode;
    }

    /**
     * 发送邮件
     * @param receiver 收件人邮箱
     * @param subject 邮件主题
     * @param content 邮件内容
     * @return 发送成功返回true,否则返回false
     */
    public boolean sendMail(String receiver, String subject, String content) {
        // 1. 配置邮件服务器属性
        Properties props = new Properties();
        props.put("mail.smtp.host", SMTP_HOST);         // SMTP服务器地址
        props.put("mail.smtp.port", SMTP_PORT);         // 端口号
        props.put("mail.smtp.auth", "true");            // 需要身份验证
        props.put("mail.smtp.ssl.enable", "true");      // 启用SSL加密
        props.put("mail.transport.protocol", "smtp");   // 协议类型

        // 2. 创建会话对象,设置身份验证
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(senderEmail, authCode);
            }
        });
        session.setDebug(false);  // 调试模式,true会输出详细发送日志

        try {
            // 3. 创建邮件消息
            MimeMessage message = new MimeMessage(session);
            // 设置发件人
            message.setFrom(new InternetAddress(senderEmail));
            // 设置收件人
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));
            // 设置邮件主题
            message.setSubject(subject, "UTF-8");  // 解决中文乱码
            // 设置邮件内容
            message.setText(content, "UTF-8");     // 解决中文乱码

            // 4. 发送邮件
            Transport.send(message);
            System.out.println("邮件发送成功!");
            return true;
        } catch (MessagingException e) {
            System.err.println("邮件发送失败:" + e.getMessage());
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 测试方法
     */
    public static void main(String[] args) {
        // 替换为你的QQ邮箱和授权码
        String senderEmail = "your_qq@qq.com";
        String authCode = "your_auth_code";

        // 创建发送者实例
        QQMailSender mailSender = new QQMailSender(senderEmail, authCode);

        // 发送测试邮件
        boolean result = mailSender.sendMail(
                "recipient@example.com",  // 收件人邮箱
                "这是一封测试邮件",        // 邮件主题
                "你好,这是通过Java程序发送的QQ邮件测试!"  // 邮件内容
        );

        if (result) {
            System.out.println("测试邮件发送成功");
        } else {
            System.out.println("测试邮件发送失败");
        }
    }
}
    

封装之后的代码:

前提:qq授权码已经在本地环境变量配置好了,使用的是spingboot项目

yaml配置:

spring:
  mail:
    # QQ邮箱SMTP服务器地址
    host: smtp.qq.com
    # SMTP服务器端口(SSL加密方式)
    port: 465
    # 发送者QQ邮箱账号(替换为你的QQ邮箱)
    username: your_qq@qq.com
    # QQ邮箱授权码(不是登录密码,需要在QQ邮箱设置中获取)
    password: ${QQ_SMTP_PASSWORD}

配置类:

package com.woniu.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;


@Component // 加入Spring容器管理
public class QQEmailSender {
    // QQ邮箱SMTP服务器地址
    private static final String SMTP_HOST = "smtp.qq.com";
    // SMTP端口,QQ邮箱为465
    private static final String SMTP_PORT = "465";

    @Value("${spring.mail.username}") // 从配置文件获取用户名
    private String username; // 发件人邮箱

    @Value("${spring.mail.password}")
    private String password; // 发件人邮箱授权码

    // 移除自定义构造方法,使用默认构造方法让Spring可以实例化
    public QQEmailSender () {
    }

    /**
     * 发送邮件
     *
     * @param to      收件人邮箱
     * @param subject 邮件主题
     * @param content 邮件内容
     * @return 是否发送成功
     */
    public boolean sendEmail (String to, String subject, String content) {
        // 配置邮件服务器属性
        Properties props = new Properties();
        props.put("mail.smtp.host", SMTP_HOST);
        props.put("mail.smtp.port", SMTP_PORT);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.ssl.enable", "true"); // 启用SSL加密
        props.put("mail.transport.protocol", "smtp");

        // 创建会话
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication () {
                // 此处的username和password必须是非空的
                return new PasswordAuthentication(username, password);
            }
        });

        try {
            // 创建邮件消息
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(username));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
            message.setSubject(subject);
            message.setText(content);

            // 发送邮件
            Transport.send(message);
            System.out.println("邮件发送成功!!!");
            return true;
        } catch (MessagingException e) {
            System.err.println("邮件发送失败: " + e.getMessage());
            e.printStackTrace();
            return false;
        }
    }
}

测试:

package com.woniu.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

/**
 * @Author: 王思莹
 * @Description:
 * @DateTime: 2025/11/11 9:46
 * @Component: 成都蜗牛学苑
 */

// 项目启动时自动执行测试
@Component
public class EmailTest implements CommandLineRunner {

    @Autowired
    private QQEmailSender qqEmailSender; // 从Spring容器注入

    @Override
    public void run(String... args) throws Exception {
        // 发送测试邮件
        qqEmailSender.sendEmail(
                "to_qq@qq.com",  // 收件人邮箱
                "测试邮件",                // 主题
                "这是一封通过Java程序发送的测试邮件!"  // 内容
        );
    }
}
posted @ 2025-11-11 09:57  LackyQueen  阅读(4)  评论(0)    收藏  举报