当前位置:首页 > 后端开发 > 正文

Javamail API如何使用

JavaMail API用于在Java应用中收发邮件,主要步骤:创建Session会话;构建Message对象并设置发件人、收件人、主题和内容;调用Transport.send()发送邮件;接收邮件则使用Store连接邮箱获取Folder中的消息,需依赖邮件服务器支持(如SMTP/POP3)。

JavaMail API 是 Java EE 平台中用于发送和接收电子邮件的核心库,支持 SMTP、POP3、IMAP 等协议,以下为详细使用指南,遵循安全性和最佳实践:


环境准备

  1. 添加依赖(以最新版 Jakarta Mail 2.1.0 为例):

    Javamail API如何使用 第1张

    <!-- Maven 依赖 --> <dependency> <groupId>org.eclipse.angus</groupId> <artifactId>angus-mail</artifactId> <version>2.0.3</version> <!-- 2025年更新 --> </dependency>
  2. 启用邮箱服务

    • 在邮箱设置中开启 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(); }


常见问题解决

  1. 认证失败

    Javamail API如何使用 第2张

    • 检查是否使用授权码而非邮箱密码
    • 确认邮箱服务已开启(如 QQ 邮箱需单独启用 POP3/SMTP)
  2. 连接超时

    • 调整超时参数: props.put("mail.smtp.connectiontimeout", "5000"); // 5秒连接超时 props.put("mail.smtp.timeout", "10000"); // 10秒读写超时
  3. 附件乱码

    • 添加编码设置: attachment.setFileName(MimeUtility.encodeText("文件名.pdf"));
    • 安全实践

      1. 敏感信息保护
        • 使用环境变量存储邮箱和授权码: String password = System.getenv("MAIL_PASSWORD");
      2. 加密传输
        • 强制启用 TLS/SSL(mail.smtp.ssl.enable=true)


      应用场景

      • 用户注册验证码
      • 系统异常告警
      • 定时报表推送
      • 邮件批量通知

      提示:生产环境建议结合 Spring Boot 的 JavaMailSender 简化配置。


      引用说明

      • 官方文档:Eclipse Angus Mail
      • RFC 5321 (SMTP 协议标准)
      • Oracle JavaMail 历史文档(兼容性参考)

      通过本指南,您可安全高效地集成邮件功能,建议测试时使用沙箱邮箱(如 Mailtrap),避免触发服务器风控。

      Javamail API如何使用 第3张

0