1. 简介

Simple Java Mail 是一个流行的开源库,旨在简化 Java 应用中的邮件发送操作。相比标准的 JavaMail API,它提供了更友好的 API 接口,让我们能专注于邮件内容和收件人,而不是底层的实现细节。

本教程将带你了解 Simple Java Mail 的配置过程,学习如何发送邮件(包括附件和 HTML 内容)、处理异常以及其他高级功能。

2. 项目配置

首先在项目的 pom.xml 文件中添加 Simple Java Mail 依赖:

<dependency>
    <groupId>org.simplejavamail</groupId>
    <artifactId>simple-java-mail</artifactId>
    <version>8.7.0</version>
</dependency>

3. 发送基础邮件

让我们从发送一封简单邮件开始。邮件正文通常包含两种格式:纯文本和 HTML。纯文本指未格式化的内容,大多数邮件客户端都能直接显示,无需特殊样式处理。 这种格式能确保所有邮件客户端都能正常阅读,无论它们是否支持 HTML。

下面是一个基础示例,展示如何构造一封简单邮件:

Email email = EmailBuilder.startingBlank()
  .from("sender@example.com")
  .to("recipient@example.com")
  .withSubject("纯文本邮件测试!")
  .withPlainText("这是一封使用 SJM 发送的测试邮件。")
  .buildEmail();

这个例子中,我们使用 EmailBuilderstartingBlank() 方法初始化一个默认配置的 Email 对象。该方法创建了一个空白邮件模板,作为构建邮件消息的起点。

随后,我们可以通过 EmailBuilder 提供的方法逐步填充发件人、收件人、主题、正文等属性。例如 withPlainText() 方法接收一个字符串参数,作为邮件正文内容。

接着使用 MailerBuilder 配置 SMTP 服务器信息(地址、端口、用户名和密码),最后通过 Mailer 类发送邮件:

Mailer mailer = MailerBuilder
  .withSMTPServer("smtp.example.com", 25, "username", "password")
  .buildMailer();

mailer.sendMail(email);

若需发送给多个收件人,只需在 to() 方法中用逗号分隔多个邮箱地址:

Email email = EmailBuilder.startingBlank()
  // ...
  .to("user1@example.com, user2@example.com, user3@example.com")
  // ...
  .buildEmail();

4. 发送附件

添加附件非常简单。我们可以使用 EmailBuilderwithAttachment() 方法附加各种类型的文件(如图片、文档或压缩包)。

以下示例展示如何附加文件:

Email email = EmailBuilder.startingBlank()
  .from("sender@example.com")
  .to("recipient@example.com")
  .withSubject("带附件的纯文本邮件!")
  .withPlainText("这是一封使用 SJM 发送的带附件测试邮件。")
  .withAttachment("重要文档.pdf", new FileDataSource("path/to/important_document.pdf"))
  .buildEmail();

示例中 withAttachment() 方法接收文件名和 FileDataSource 对象作为参数。若需附加多个文件,可使用 AttachmentResource 对象列表:

List<AttachmentResource> arList = new ArrayList<>();
arList.add(new AttachmentResource("重要文档.pdf", new FileDataSource("path/to/important_document.pdf")));
arList.add(new AttachmentResource("公司logo.png", new FileDataSource("path/to/company_logo.png")));

此时使用 withAttachments() 方法替代 withAttachment(),传入附件资源集合:

Email email = EmailBuilder.startingBlank()
  // ...
  .withAttachments(arList)
  .buildEmail();

5. 发送 HTML 内容

Simple Java Mail 支持发送 HTML 邮件并直接嵌入图片,适合创建视觉丰富的邮件。要在 HTML 中嵌入图片,需使用 CID(Content-ID)方案引用图片。

CID 机制充当唯一标识符,将 HTML 中的图片引用与邮件附件的实际图片数据关联起来。 本质上,它告诉邮件客户端在哪里找到图片以便正确显示。

以下是使用 CID 引用图片的 HTML 内容示例:

String htmlContent = "<h1>这是一封 HTML 格式邮件</h1>" +
  "<p>邮件正文包含附加信息和格式化内容。</p>" +
  "<img src=\"cid:company_logo\" alt=\"公司 Logo\">";

示例中 <img> 标签通过 cid:company_logo 标识符引用图片。构建邮件时,使用 withEmbeddedImage() 方法将图片附件与 company_logo 标识符关联:

Email email = EmailBuilder.startingBlank()
  .from("sender@example.com")
  .to("recipient@example.com")
  .withSubject("带 HTML 和嵌入图片的邮件!")
  .withHTMLText(htmlContent)
  .withEmbeddedImage("company_logo", new FileDataSource("path/to/company_logo.png"))
  .buildEmail();

图片数据本身不会直接嵌入 HTML 内容,而是作为单独的附件包含在邮件中。

建议同时提供纯文本版本(通过 withPlainText())作为 HTML 的后备方案:这能为不支持 HTML 渲染的邮件客户端提供降级体验:

Email email = EmailBuilder.startingBlank()
  // ...
  .withHTMLText(htmlContent)
  .withPlainText("您的邮件客户端不支持 HTML,因此显示为纯文本。")
  .buildEmail();

6. 回复与转发邮件

Simple Java Mail 提供了构建回复和转发邮件的功能。回复邮件时,原始邮件内容会被引用在回复正文中。 转发邮件时,原始邮件会作为独立内容包含在转发邮件中。

要回复邮件,使用 replyingTo() 方法并传入接收到的邮件对象,然后配置邮件内容:

Email email = EmailBuilder
  .replyingTo(receivedEmail)
  .from("replier@example.com")
  .prependText("这是一封回复邮件。原始邮件内容如下:")
  .buildEmail();

转发邮件则使用 forwarding() 方法:

Email email = EmailBuilder
  .forwarding(receivedEmail)
  .from("forwarder@example.com")
  .prependText("这是一封转发邮件。原始邮件见下方:")
  .buildEmail();

⚠️ 重要提示:Simple Java Mail 本身无法直接从邮件服务器检索邮件。需要额外使用如 javax.mail 等库来获取邮件,才能进行回复或转发操作。

7. 异常处理

发送邮件时必须处理传输过程中可能出现的异常,以确保健壮性。Simple Java Mail 在发送失败时会抛出 MailException 受检异常。

将邮件发送逻辑包裹在 try-catch 块中捕获 MailException

try {
    // ...
    mailer.sendMail(email);
} catch (MailException e) {
    // 处理异常逻辑
}

此外,发送前验证邮箱地址可降低传输错误概率。使用 mailer 对象的 validate() 方法:

boolean validEmailAdd = mailer.validate(email);
if (validEmailAdd) {
    mailer.sendMail(email);
} else {
    // 提示用户邮箱地址无效
}

8. 高级配置选项

Simple Java Mail 还提供了超越基础功能的高级配置选项,包括自定义邮件头、配置回执和限制邮件大小等。

8.1. 设置自定义邮件头

使用 MailerBuilderwithHeader() 方法定义自定义邮件头, 添加标准头之外的信息:

Email email = EmailBuilder.startingBlank()
  .from("sender@example.com")
  .to("recipient@example.com")
  .withSubject("带自定义头的邮件")
  .withPlainText("这是一条重要消息。")
  .withHeader("X-Priority", "1")
  .buildEmail();

8.2. 配置送达/已读回执

送达回执确认邮件已送达收件人邮箱,已读回执确认收件人已打开邮件。 Simple Java Mail 通过特定邮件头支持这些功能:Return-Receipt-To 用于送达回执,Disposition-Notification-To 用于已读回执。

可显式指定接收回执的邮箱地址。若未指定,默认使用 replyTo 地址(若有),否则使用 fromAddress

配置方式如下:

Email email = EmailBuilder.startingBlank()
  .from("sender@example.com")
  .to("recipient@example.com")
  .withSubject("已配置送达/已读回执的邮件!")
  .withPlainText("这是一封带送达/已读回执的邮件。")
  .withDispositionNotificationTo(new Recipient("name", "receipt@example.com", Message.RecipientType.TO))
  .withReturnReceiptTo(new Recipient("name", "receipt@example.com", Message.RecipientType.TO))
  .buildEmail();

8.3. 限制最大邮件大小

多数邮件服务器对可接收的邮件大小有限制。Simple Java Mail 提供了防止发送超大邮件的功能, 避免投递时出错。

使用 MailerBuilderwithMaximumEmailSize() 方法配置最大允许大小(单位:字节):

Mailer mailer = MailerBuilder
  .withMaximumEmailSize(1024 * 1024 * 5)
  .buildMailer();

示例中将最大邮件大小设为 5MB。若尝试发送超过此限制的邮件,Simple Java Mail 会抛出 MailerException,其原因为 EmailTooBigException

9. 总结

本文介绍了 Simple Java Mail 的核心功能,包括发送带附件和嵌入图片的 HTML 邮件,以及管理回执、处理邮件回复/转发等高级特性。

总体而言,它非常适合需要高效、简洁发送邮件的 Java 应用。

示例源代码可在 GitHub 获取。


原始标题:Introduction to Simple Java Mail