目录
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);
}
}