Java实现邮箱的发送(QQ邮箱、腾讯云)

目录

QQ邮箱

1. 开启SMTP服务,获取授权码

2. 添加依赖

3. 具体代码实现

4. 发送限制

腾讯云

1. 登录腾讯云账号

2. 跟随快速入门配置基础的一些信息

3. 域名配置

4. 发信地址配置

5. 发信模板

6. 获取SecretId 和 SecretKey

7. 具体代码实现


QQ邮箱

1. 开启SMTP服务,获取授权码

登录QQ邮箱网页版 → 设置 → 账户 → 找到「POP3/SMTP服务」→ 点击「开启」→ 完成短信验证后获取16位授权码(非邮箱密码)

2. 添加依赖

<dependency>
       <groupId>com.sun.mail</groupId>
       <artifactId>javax.mail</artifactId>
       <version>1.6.2</version> <!-- 使用最新版本 -->
</dependency>

3. 具体代码实现

// QQ邮箱SMTP配置
String host = "smtp.qq.com";
int port = 465;
String username = "xxx@qq.com"; // 替换为你的QQ邮箱
String password = "xxx"; // 替换为你的授权码
String toEmail = "xxx@qq.com"; // 替换为接收邮箱

// 配置邮件服务器
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", port);
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.auth", "true");

// 创建邮件会话
Session session = Session.getInstance(props, new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(username, password);
    }
});

 try {
    // 创建邮件对象
    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(username));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail));
    message.setSubject("邮箱验证测试");

    // 设置邮件正文(带HTML格式)
    String htmlContent = "替换成你想要的邮箱HTML格式";
    message.setContent(htmlContent, "text/html;charset=UTF-8");

    // 发送邮件
    Transport.send(message);
    System.out.println("邮件发送成功!");
} catch (MessagingException e) {
    throw new RuntimeException("邮件发送失败: " + e.getMessage());
}

4. 发送限制

  • 普通用户:每日最多发送100封邮件(含群发)
  • 付费用户(含QQ会员/VIP):每日上限提升至500封邮件
  • 企业用户:每日上限提升至1000封邮件

腾讯云

1. 登录腾讯云账号

进入登录 - 腾讯云

2. 跟随快速入门配置基础的一些信息

3. 域名配置

阿里云为例,找到域名控制台-域名解析-添加对应记录

4. 发信地址配置

这步要记得,需要右边添加一下SMTP密码

5. 发信模板(API发送可以不要)

写一个HTML文件,来规范自己的发信模板,下面是参考的模板:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>邮箱验证通知</title>
    <style type="text/css">
        /* 内联样式确保兼容性 */
        .container { max-width: 600px; margin: 20px auto; padding: 30px; background: #f8f9fa; }
        .brand-header { text-align: center; border-bottom: 2px solid #1890ff; padding-bottom: 20px; }
        .code-section { background: white; padding: 25px; margin-top: 20px; border-radius: 8px; }
        .dynamic-code { font-size: 32px; color: #1890ff; letter-spacing: 5px; font-weight: 700; }
        .footer { margin-top: 30px; color: #666; font-size: 12px; }
    </style>
</head>
<body>
    <div class="container">
        <!-- 品牌标识区 -->
        <div class="brand-header">
            <h2 style="color:#2d3748;margin-top:15px;">安全验证中心</h2>
        </div>
        
        <!-- 动态内容区 -->
        <div class="code-section">
            <p>尊敬的用户:</p>
            <p>您正在进行登录操作,验证码为:</p>
            <div class="dynamic-code">{{verification_code}}</div>
            <p style="color:#e53e3e;">* 有效期10分钟,请勿泄露给他人</p>
        </div>

        <!-- 底部信息 -->
        <div class="footer">
            <p>本邮件为系统自动发送,无需回复</p>
            <p>© 2025 XXX. All rights reserved.</p>
        </div>
    </div>
</body>
</html>

以{{verification_code}}为例,这个到后面代码里面可以对模板进行替换,一般这个发信模板都需要审核1-2个工作日

6. 获取SecretId 和 SecretKey

  • 操作路径
    登录 腾讯云控制台访问管理API密钥管理新建密钥
  • 关键说明
    • 密钥创建时 仅显示一次SecretKey,需立即下载或复制保存(后续无法查询)
    • 每个主账号最多可创建 2组API密钥,建议按业务场景分离使用(如生产环境和测试环境)

7. 具体代码实现

如果你确保上述操作已经全部完成的前提下,添加以下依赖:

<!-- 必须引入的核心依赖 -->
<dependency>
    <groupId>com.tencentcloudapi</groupId>
    <artifactId>tencentcloud-sdk-java</artifactId>
    <version>3.1.1196</version> <!-- 2025年最新稳定版 -->
</dependency>

<!-- 可选:HTTP客户端依赖 -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>

下面是一个示例代码:

@Test// 设置10秒超时
    public void testSendEmail() throws Exception {
        final Properties props = new Properties();

        // 表示SMTP发送邮件,需要进行身份验证
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", SMTP_HOST);
        // 如果使用ssl,则去掉使用25端口的配置,进行如下配置,
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.port", SMTP_PORT);
        props.put("mail.smtp.port", SMTP_PORT);
        // 发件人的账号,填写控制台配置的发信地址,比如xxx@xxx.com
        props.put("mail.user", FROM_EMAIL);
        // 访问SMTP服务时需要提供的密码(在控制台选择发信地址进行设置)
        props.put("mail.password", FROM_EMAIL_PASSWORD);
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.put("mail.smtp.ssl.enable", "true");

        Authenticator authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                // 用户名、密码
                String userName = props.getProperty("mail.user");
                String password = props.getProperty("mail.password");
                return new PasswordAuthentication(userName, password);
            }
        };
        // 使用环境属性和授权信息,创建邮件会话
        Session mailSession = Session.getInstance(props, authenticator);
        // 创建邮件消息
        MimeMessage message = new MimeMessage(mailSession) {
            //@Override
            //protected void updateMessageID() throws MessagingException {
            //设置自定义Message-ID值
            //setHeader("Message-ID", messageIDValue);
            //}
        };
        try {
            // 设置发件人邮件地址和名称。填写控制台配置的发信地址,比如xxx@xxx.com。和上面的mail.user保持一致。名称用户可以自定义填写。
            InternetAddress from = new InternetAddress(FROM_EMAIL, FROM_EMAIL_USER);
            message.setFrom(from);
            //可选。设置回信地址
            //ddress[] a = new Address[1];
            //a[0] = new InternetAddress("***");
            //message.setReplyTo(a);
            // 设置收件人邮件地址,比如yyy@yyy.com
            InternetAddress to = new InternetAddress("1078876470@qq.com");
            message.setRecipient(MimeMessage.RecipientType.TO, to);
            //如果同时发给多人,才将上面两行替换为如下(因为部分收信系统的一些限制,尽量每次投递给一个人;同时我们限制单次允许发送的人数是50人):
            //InternetAddress[] adds = new InternetAddress[2];
            //adds[0] = new InternetAddress("xxx@xxx.com");
            //adds[1] = new InternetAddress("xxx@xxx.com");
            //message.setRecipients(Message.RecipientType.TO, adds);
            // 设置邮件标题
            message.setSubject("测试邮件");
            message.setHeader("Content-Transfer-Encoding", "base64");
            // 设置邮件的内容体 type: text/plain(纯文本)text/html(HTML 文档)
            message.setContent("<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<title>hello world</title>\n</head>\n<body>\n " +
                    "<h1>我的第一个标题</h1>\n    <p>我的第一个段落。</p>\n</body>\n</html>", "text/html;charset=UTF-8");
            //发送邮件
            Transport.send(message);
        } catch (MessagingException | UnsupportedEncodingException e) {
            String err = e.getMessage();
            err = new String(err.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
            System.out.println(err);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值