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),避免触发服务器风控。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/34845.html