Java 发送邮件
Java 标准库不提供发邮件 API,业界统一使用 JavaMail 扩展库(现已更名 Jakarta Mail)。原理是:程序作为客户端,通过 SMTP 协议把邮件提交给邮件服务器(QQ、163、Gmail 等),由服务器负责投递。学会后程序就能自动发送验证码、告警与报表,是电商、运维类系统的常见需求。
JavaMail 简介与依赖
JavaMail 提供几个核心类:Session 保存服务器配置,Message 描述邮件内容,Transport 负责真正发送。Maven 引入依赖:
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
新版项目也可改用 jakarta.mail(artifact 与包名改为 jakarta.mail.*),用法一致。
SMTP 服务器配置
发送前需在邮箱后台开启 SMTP 服务并获取授权码(不是登录密码),常见配置:
| 邮箱 | SMTP 服务器 | 端口 | 说明 |
|---|---|---|---|
| QQ 邮箱 | smtp.qq.com | 465(SSL) | 设置 → 账户 → 开启 SMTP 生成授权码 |
| 163 邮箱 | smtp.163.com | 465(SSL) | 开启"客户端授权密码" |
| Gmail | smtp.gmail.com | 587(STARTTLS) | 需开启两步验证并用应用专用密码 |
发送纯文本邮件完整示例
需配置环境后运行:填入真实邮箱、授权码与收件人,并确保 465 端口可访问:
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
public class SendMail {
public static void main(String[] args) throws Exception {
final String from = "你的邮箱@qq.com"; // 发件邮箱
final String authCode = "你的SMTP授权码"; // 授权码,非登录密码
String to = "收件人@example.com";
Properties props = new Properties(); // 1. 组装服务器配置
props.put("mail.smtp.host", "smtp.qq.com");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.ssl.enable", "true"); // 465 端口启用 SSL
props.put("mail.smtp.auth", "true");
Session session = Session.getInstance(props, // 2. 创建会话
new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(from, authCode);
}
});
MimeMessage msg = new MimeMessage(session); // 3. 构造邮件
msg.setFrom(new InternetAddress(from));
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
msg.setSubject("JavaMail 测试邮件");
msg.setText("你好,这是用 Java 发送的第一封邮件!");
Transport.send(msg); // 4. 发送
System.out.println("邮件发送成功");
}
}
运行后登录收件邮箱即可看到邮件。若使用 587 端口,把 ssl.enable 换成 mail.smtp.starttls.enable=true。
带附件的 MimeMessage
附件需要 MimeBodyPart 组装部件、MimeMultipart 承载多个部件,最后 setContent 设置给邮件(片段:在 SendMail 的 main 中创建好 msg 后运行):
MimeBodyPart text = new MimeBodyPart();
text.setText("请查收附件");
MimeBodyPart file = new MimeBodyPart();
file.attachFile("D:/报告.pdf"); // 本地文件路径
MimeMultipart mp = new MimeMultipart();
mp.addBodyPart(text);
mp.addBodyPart(file);
msg.setContent(mp); // 邮件内容变为"多部件"
常见失败原因
- 535 认证失败:把登录密码当授权码用,或授权码抄错、邮箱未开启 SMTP 服务。
- 连接超时 / SSL 错误:端口配错——465 走 SSL、587 走 STARTTLS,不能混用。
- 被服务器拒收:发送频率过高或内容含敏感词触发风控;先检查垃圾箱。
- 缺少依赖:报 ClassNotFoundException(javax.mail.*)说明 jar 未正确引入。
小结:发邮件四步走——引入 JavaMail、配置 SMTP 主机与授权码、构造 Session 和 MimeMessage、调用 Transport.send();遇认证失败优先检查授权码与端口(465/587)。