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();
这个例子中,我们使用 EmailBuilder
的 startingBlank()
方法初始化一个默认配置的 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. 发送附件
添加附件非常简单。我们可以使用 EmailBuilder
的 withAttachment()
方法附加各种类型的文件(如图片、文档或压缩包)。
以下示例展示如何附加文件:
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. 设置自定义邮件头
使用 MailerBuilder
的 withHeader()
方法定义自定义邮件头, 添加标准头之外的信息:
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 提供了防止发送超大邮件的功能, 避免投递时出错。
使用 MailerBuilder
的 withMaximumEmailSize()
方法配置最大允许大小(单位:字节):
Mailer mailer = MailerBuilder
.withMaximumEmailSize(1024 * 1024 * 5)
.buildMailer();
示例中将最大邮件大小设为 5MB。若尝试发送超过此限制的邮件,Simple Java Mail 会抛出 MailerException
,其原因为 EmailTooBigException
。
9. 总结
本文介绍了 Simple Java Mail 的核心功能,包括发送带附件和嵌入图片的 HTML 邮件,以及管理回执、处理邮件回复/转发等高级特性。
总体而言,它非常适合需要高效、简洁发送邮件的 Java 应用。
示例源代码可在 GitHub 获取。