上一篇
JavaMail API用于在Java应用中收发邮件,主要步骤:创建Session会话;构建Message对象并设置发件人、收件人、主题和内容;调用Transport.send()发送邮件;接收邮件则使用Store连接邮箱获取Folder中的消息,需依赖邮件服务器支持(如SMTP/POP3)。
JavaMail API 是 Java EE 平台中用于发送和接收电子邮件的核心库,支持 SMTP、POP3、IMAP 等协议,以下为详细使用指南,遵循安全性和最佳实践:
环境准备
-
添加依赖(以最新版 Jakarta Mail 2.1.0 为例):
<!-- Maven 依赖 --> <dependency> <groupId>org.eclipse.angus</groupId> <artifactId>angus-mail</artifactId> <version>2.0.3</version> <!-- 2025年更新 --> </dependency>
-
启用邮箱服务:

- 在邮箱设置中开启 SMTP/POP3/IMAP 服务(如 QQ 邮箱需生成授权码代替密码)。
核心对象解析
| 对象 | 作用 |
|---|---|
Session |
邮件会话配置(服务器、认证等) |
Message |
载体(主题、正文、附件) |
Transport |
发送邮件的传输通道 |
Store |
接收邮件的存储连接 |
发送邮件(SMTP)
import jakarta.mail.*;
import jakarta.mail.internet.*;
public class MailSender {
public static void main(String[] args) {
// 1. 配置会话
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.qq.com"); // SMTP服务器
props.put("mail.smtp.port", "587"); // TLS端口
props.put("mail.smtp.auth", "true"); // 启用认证
props.put("mail.smtp.starttls.enable", "true"); // 加密传输
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("your_email@qq.com", "授权码"); // 替换为实际值
}
});
try {
// 2. 构建邮件
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("测试邮件主题");
// 3. 设置内容(支持HTML)
String htmlContent = "<h1>Hello JavaMail!</h1><p>这是一封测试邮件</p>";
message.setContent(htmlContent, "text/html; charset=utf-8");
// 4. 添加附件
MimeBodyPart attachment = new MimeBodyPart();
attachment.attachFile(new File("path/to/file.pdf")); // 替换实际路径
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(attachment);
message.setContent(multipart);
// 5. 发送邮件
Transport.send(message);
System.out.println("邮件发送成功!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
接收邮件(POP3/IMAP)
// 配置会话(参考发送邮件)
Properties props = new Properties();
props.put("mail.pop3.host", "pop.qq.com");
props.put("mail.pop3.port", "995");
props.put("mail.pop3.ssl.enable", "true"); // 启用SSL
Session session = Session.getDefaultInstance(props);
try (Store store = session.getStore("pop3")) {
// 1. 连接邮箱
store.connect("your_email@qq.com", "授权码");
// 2. 获取收件箱
Folder inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
// 3. 读取最新10封邮件
Message[] messages = inbox.getMessages();
for (int i = Math.max(0, messages.length - 10); i < messages.length; i++) {
System.out.println("主题: " + messages[i].getSubject());
System.out.println("发件人: " + messages[i].getFrom()[0]);
System.out.println("内容: " + messages[i].getContent());
}
inbox.close(false);
} catch (Exception e) {
e.printStackTrace();
}
常见问题解决
-
认证失败:
- 检查是否使用授权码而非邮箱密码
- 确认邮箱服务已开启(如 QQ 邮箱需单独启用 POP3/SMTP)
-
连接超时:

- 调整超时参数:
props.put("mail.smtp.connectiontimeout", "5000"); // 5秒连接超时 props.put("mail.smtp.timeout", "10000"); // 10秒读写超时
- 调整超时参数:
-
附件乱码:
- 添加编码设置:
attachment.setFileName(MimeUtility.encodeText("文件名.pdf"));
- 添加编码设置:
安全实践
- 敏感信息保护:
- 使用环境变量存储邮箱和授权码:
String password = System.getenv("MAIL_PASSWORD");
- 使用环境变量存储邮箱和授权码:
- 加密传输:
- 强制启用 TLS/SSL(
mail.smtp.ssl.enable=true)
- 强制启用 TLS/SSL(
应用场景
- 用户注册验证码
- 系统异常告警
- 定时报表推送
- 邮件批量通知
提示:生产环境建议结合 Spring Boot 的
JavaMailSender简化配置。
引用说明:
- 官方文档:Eclipse Angus Mail
- RFC 5321 (SMTP 协议标准)
- Oracle JavaMail 历史文档(兼容性参考)
通过本指南,您可安全高效地集成邮件功能,建议测试时使用沙箱邮箱(如 Mailtrap),避免触发服务器风控。

