上一篇
使用Java发送邮件主要依赖JavaMail API,核心步骤包括:配置SMTP服务器参数(主机/端口/认证)、创建Session会话、构建MIME消息体(设置发件人/收件人/主题/正文),最后通过Transport发送,需导入javax.mail相关依赖包,注意处理SSL加密等安全设置。
在Java中发送电子邮件主要依赖Jakarta Mail(原JavaMail API)实现,以下是详细步骤和完整代码示例,涵盖文本邮件、HTML邮件及附件发送:
准备工作
-
添加依赖(Maven项目):
<dependency> <groupId>com.sun.mail</groupId> <artifactId>jakarta.mail</artifactId> <version>2.0.1</version> </dependency>
-
获取SMTP服务:

- 使用QQ邮箱、163邮箱或企业邮箱(需开启SMTP服务)
- 以QQ邮箱为例:登录后进入“设置” → “账户” → 开启“POP3/SMTP服务”,获取授权码(非登录密码)。
发送文本邮件
import jakarta.mail.*;
import jakarta.mail.internet.*;
import java.util.Properties;
public class EmailSender {
public static void main(String[] args) {
// 1. 配置SMTP服务器参数
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.qq.com"); // QQ邮箱SMTP服务器
props.put("mail.smtp.port", "587"); // TLS端口
props.put("mail.smtp.auth", "true"); // 需要认证
props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密
// 2. 创建Session对象(传入邮箱账号和授权码)
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("your_email@qq.com", "your_auth_code");
}
});
try {
// 3. 构建邮件内容
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("your_email@qq.com")); // 发件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("recipient@example.com")); // 收件人
message.setSubject("Java邮件测试"); // 主题
message.setText("这是一封通过Java发送的文本邮件。"); // 正文
// 4. 发送邮件
Transport.send(message);
System.out.println("邮件发送成功!");
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
发送HTML邮件与附件
// ...(Session配置同上,省略重复代码)
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("your_email@qq.com"));
message.setRecipient(Message.RecipientType.TO, new InternetAddress("recipient@example.com"));
message.setSubject("带附件的HTML邮件");
// 创建多部分消息(正文+附件)
Multipart multipart = new MimeMultipart();
// 1. 添加HTML正文
MimeBodyPart htmlPart = new MimeBodyPart();
String htmlContent = "<h1 style='color:blue;'>Java邮件测试</h1><p>这是一封<strong>HTML格式</strong>的邮件!</p>";
htmlPart.setContent(htmlContent, "text/html; charset=utf-8");
multipart.addBodyPart(htmlPart);
// 2. 添加附件
MimeBodyPart attachmentPart = new MimeBodyPart();
attachmentPart.attachFile(new File("C:/test_document.pdf")); // 附件路径
attachmentPart.setFileName("报告.pdf"); // 设置附件显示名称
multipart.addBodyPart(attachmentPart);
// 绑定内容到邮件
message.setContent(multipart);
Transport.send(message);
System.out.println("HTML邮件发送成功!");
} catch (Exception e) {
e.printStackTrace();
}
关键配置说明
| 参数 | 示例值 | 作用 |
|---|---|---|
mail.smtp.host |
smtp.qq.com |
QQ邮箱SMTP服务器地址 |
mail.smtp.port |
587 或 465 |
TLS端口(587) / SSL端口(465) |
mail.smtp.auth |
true |
必须开启认证 |
mail.smtp.starttls.enable |
true |
启用TLS加密传输 |
常见问题解决
-
认证失败:
- 检查邮箱账号和授权码(非登录密码)
- 开启SMTP服务(如QQ邮箱需生成授权码)
-
连接超时:

props.put("mail.smtp.connectiontimeout", "5000"); // 5秒连接超时 props.put("mail.smtp.timeout", "10000"); // 10秒操作超时 -
端口被屏蔽:
- 尝试切换端口:
587(TLS) 或465(SSL) - 企业邮箱需联系管理员确认端口
- 尝试切换端口:
安全建议
- 避免硬编码密码:
将授权码存储在环境变量或加密配置文件中

- 强制加密:
- 始终启用
mail.smtp.starttls.enable=true或mail.smtp.ssl.enable=true
- 始终启用
- 验证证书(生产环境):
props.put("mail.smtp.ssl.checkserveridentity", true); // 验证服务器证书
引用说明
- Jakarta Mail官方文档:Eclipse Jakarta Mail Project
- QQ邮箱SMTP设置指南:帮助中心
- JavaMail API历史迁移说明:Oracle移交公告
本文代码基于Jakarta Mail 2.0.1编写,适用于JDK 8+,实际使用时请替换邮箱账号、授权码及SMTP服务器地址,企业邮箱配置请参考服务商提供的文档。
