1. 概述

本篇教程将介绍如何使用 Jakarta Mail API 在 Java 中发送带有单个或多个附件的电子邮件。

2. 项目配置

我们首先在项目中添加 angus-mail 依赖:

<dependency>
    <groupId>org.eclipse.angus</groupId>
    <artifactId>angus-mail</artifactId>
    <version>2.0.1</version>
</dependency>

Angus Mail 是 Eclipse 提供的 Jakarta Mail API 的实现之一,目前是较为推荐的选择。

3. 发送带附件的邮件

首先,我们需要配置邮件服务提供商的相关认证信息(比如 SMTP 地址、端口、用户名和密码)。这部分内容可以参考 Baeldung 的基础邮件发送指南

然后创建一个 Session 对象,传入主机地址、端口号、用户名和密码等参数。这些信息通常由你的邮件服务商提供,当然也可以使用一些假的 SMTP 测试服务器来调试代码。

Session 对象本质上是一个连接工厂,负责处理 JavaMail 的配置和认证逻辑。

有了 Session 实例之后,我们可以继续构造邮件内容。先创建 MimeMessageMimeBodyPart 对象:

Message message = new MimeMessage(session); 
message.setFrom(new InternetAddress(from)); 
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); 
message.setSubject("Test Mail Subject"); 

BodyPart messageBodyPart = new MimeBodyPart(); 
messageBodyPart.setText("Mail Body");

上面这段代码完成了邮件的基本信息设置:发件人、收件人、主题,以及邮件正文部分。

接下来要添加附件,需要再创建一个 MimeBodyPart

MimeBodyPart attachmentPart = new MimeBodyPart();
attachmentPart.attachFile(new File("path/to/file"));

现在我们有两个 MimeBodyPart:一个是正文内容,另一个是附件。我们需要把它们组合起来,使用 MimeMultipart 来承载:

Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
multipart.addBodyPart(attachmentPart);

最后,将这个 Multipart 设置为邮件的内容,并调用 Transport.send() 方法发送邮件:

message.setContent(multipart);
Transport.send(message);

📌 总结一下结构关系:

  • Message 包含一个 MimeMultipart
  • MimeMultipart 可以包含多个 MimeBodyPart
  • 每个 MimeBodyPart 可以是正文内容、附件等

⚠️ 如果你想发送多个附件,只需要继续创建并添加更多的 MimeBodyPart 即可。

4. 小结

这篇教程讲解了如何在 Java 中通过 Jakarta Mail API 实现发送带附件的邮件功能,支持单个和多个附件。

一如既往,完整的示例代码可以在 GitHub 上找到:https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-networking-2


原始标题:Sending Emails with Attachments in Java | Baeldung