使用 SMTP 发送电子邮件
本指南演示了 Quarkus 应用程序如何使用 SMTP 服务器发送电子邮件。这是一个入门指南。有关邮件程序及其用法的更完整解释,请参阅 Quarkus Mailer 参考文档。
先决条件
要完成本指南,您需要
-
大约 15 分钟
-
一个 IDE
-
已安装 JDK 17+ 并正确配置了
JAVA_HOME
-
Apache Maven 3.9.9
-
如果您想使用它,可以选择 Quarkus CLI
-
如果您想构建本机可执行文件(或者如果您使用本机容器构建,则为 Docker),可以选择安装 Mandrel 或 GraalVM 并进行适当的配置
-
SMTP 主机名、端口和凭据,以及电子邮件地址
-
cURL
架构
在本指南中,我们将构建一个应用程序
-
公开一个 HTTP 端点,
-
在端点收到 HTTP 请求时发送电子邮件。
该应用程序将演示如何使用命令式和响应式邮件程序 API 发送电子邮件。
附件、内联附件、模板、测试和更高级的配置涵盖在 Mailer 参考文档 中。
解决方案
我们建议您按照以下章节中的说明,逐步创建应用程序。但是,您可以直接转到完整的示例。
克隆 Git 存储库:git clone https://github.com/quarkusio/quarkus-quickstarts.git
,或下载一个存档。
解决方案位于 mailer-quickstart
目录中。
创建 Maven 项目
首先,我们需要一个新项目。使用以下命令创建一个新项目
对于 Windows 用户
-
如果使用 cmd,(不要使用反斜杠
\
并将所有内容放在同一行上) -
如果使用 Powershell,请将
-D
参数放在双引号中,例如"-DprojectArtifactId=mailer-quickstart"
此命令会生成一个 Maven 结构,其中包括以下扩展
-
Quarkus REST(以前称为 RESTEasy Reactive),用于公开 REST 端点
-
Mailer,以便我们可以发送电子邮件
-
Qute,我们的模板引擎
如果您已经配置了 Quarkus 项目,则可以通过在项目根目录中运行以下命令将 mailer
扩展添加到项目中
quarkus extension add mailer
./mvnw quarkus:add-extension -Dextensions='mailer'
./gradlew addExtension --extensions='mailer'
这会将以下内容添加到您的 pom.xml
中
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-mailer</artifactId>
</dependency>
implementation("io.quarkus:quarkus-mailer")
在 IDE 中打开生成的项目。在终端中,导航到项目并在开发模式下启动应用程序
quarkus dev
./mvnw quarkus:dev
./gradlew --console=plain quarkusDev
实现 HTTP 端点
首先,创建 src/main/java/org/acme/MailResource.java
文件,内容如下
package org.acme;
import io.quarkus.mailer.Mail;
import io.quarkus.mailer.Mailer;
import io.smallrye.common.annotation.Blocking;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
@Path("/mail") (1)
public class MailResource {
@Inject Mailer mailer; (2)
@GET (3)
@Blocking (4)
public void sendEmail() {
mailer.send(
Mail.withText("quarkus@quarkus.io", (5)
"Ahoy from Quarkus",
"A simple email sent from a Quarkus application."
)
);
}
}
1 | 配置我们 HTTP 端点的根路径 |
2 | 注入 Quarkus 管理的 Mailer 对象 |
3 | 创建一个方法来处理 /mail 上的 HTTP GET 请求 |
4 | 由于我们使用的是 Quarkus REST 和命令式邮件程序,因此需要添加 @Blocking 注释。稍后我们将看到响应式变体。 |
5 | 通过配置收件人、主题和正文来创建 Mail 对象 |
MailResource
类实现了我们应用程序公开的 HTTP API。它处理 `https://:8080/mail` 上的 GET
请求。
因此,如果您在另一个终端中运行
> curl https://:8080/mail
您应该会在应用程序日志中看到类似以下的内容
INFO [quarkus-mailer] (executor-thread-0) Sending email Ahoy from Quarkus from null to [quarkus@quarkus.io], text body:
A simple email sent from a Quarkus application.
html body:
<empty>
由于应用程序以开发模式运行,因此它会模拟发送电子邮件。它会在日志中打印出来,因此您可以检查将要发送的内容。
本节使用了命令式邮件程序 API。它会阻塞调用线程,直到电子邮件发送完毕。 |
Quarkus Mailpit 扩展对于测试电子邮件非常有用。它为 Mailpit 提供了开发服务,Mailpit 是一个用于测试和调试电子邮件发送的精美 UI。 |
使用响应式邮件程序
上一节使用了命令式邮件程序。Quarkus 还提供了响应式 API。
Mutiny
响应式邮件程序使用 Mutiny 响应式类型。如果您不熟悉 Mutiny,请参阅 Mutiny - 直观的响应式编程库。 |
在同一个类中,添加
@Inject
ReactiveMailer reactiveMailer; (1)
@GET
@Path("/reactive") (2)
public Uni<Void> sendEmailUsingReactiveMailer() { (3)
return reactiveMailer.send( (4)
Mail.withText("quarkus@quarkus.io",
"Ahoy from Quarkus",
"A simple email sent from a Quarkus application using the reactive API."
)
);
}
1 | 注入响应式邮件程序。要导入的类是 io.quarkus.mailer.reactive.ReactiveMailer 。 |
2 | 配置用于处理 /mail/reactive 上 GET 请求的路径。请注意,由于我们使用的是响应式 API,因此不需要 @Blocking |
3 | 该方法返回一个 Uni<Void> ,当邮件发送完成时它会完成。它不会阻塞调用线程。 |
4 | API 与命令式 API 类似,只是 send 方法返回一个 Uni<Void> 。 |
现在,在您的终端中运行
> curl https://:8080/mail/reactive
您应该会在应用程序日志中看到类似以下的内容
INFO [quarkus-mailer] (vert.x-eventloop-thread-11) Sending email Ahoy from Quarkus from null to [quarkus@quarkus.io], text body:
A simple email sent from a Quarkus application using the reactive API.
html body:
<empty>
结论
本指南展示了如何从 Quarkus 应用程序发送电子邮件。 Mailer 参考指南 提供了有关邮件程序用法和配置的更多详细信息,例如