Sending emails using SMTP
This guide demonstrates how your Quarkus application can send emails using an SMTP server. This is a getting started guide. Check the Quarkus Mailer Reference documentation for more complete explanation about the mailer and its usage.
Prerequisites
完成这个指南,你需要:
-
大概15分钟
-
编辑器
-
安装JDK 11以上版本并正确配置了
JAVA_HOME
-
Apache Maven 3.9.1
-
如果你愿意的话,还可以选择使用Quarkus CLI
-
如果你想构建原生可执行程序,可以选择安装Mandrel或者GraalVM,并正确配置(或者使用Docker在容器中进行构建)
-
The SMTP hostname, port and credentials, and an email address
-
cURL
Architecture
In this guide, we will build an application:
-
exposing an HTTP endpoint,
-
sending email when the endpoint receives an HTTP request.
The application will demonstrate how to send emails using the imperative and reactive mailer APIs.
Attachments, inlined attachments, templating, testing and more advanced configuration are covered in the Mailer Reference documentation.
Solution
We recommend that you follow the instructions in the next sections and create the application step by step. However, you can go right to the completed example.
Clone the Git repository: git clone https://github.com/quarkusio/quarkus-quickstarts.git
, or download an archive.
The solution is located in the mailer-quickstart
directory.
Creating the Maven Project
First, we need a project. Open your browser to https://code.quarkus.io and select the following extensions:
-
RESTEasy Reactive - we use it to expose our HTTP endpoint
-
Mailer - which offer the possibility to send emails
-
Qute - the Quarkus template engine
Alternatively, this link pre-configures the application. Click on "Generate your application", download the zip file and unzip it on your file system. Open the generated project in your IDE. In a terminal, navigate to the project and start dev mode:
quarkus dev
./mvnw quarkus:dev
./gradlew --console=plain quarkusDev
Implement the HTTP endpoint
First, create the src/main/java/org/acme/MailResource.java
file, with the following content:
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 | Configure the root path of our HTTP endpoint |
2 | Inject the Mailer object managed by Quarkus |
3 | Create a method that will handle the HTTP GET request on /mail |
4 | Because we are using RESTEasy Reactive and the imperative mailer, we need to add the @Blocking annotation. We will see later the reactive variant. |
5 | Create a Mail object by configuring the to recipient, the subject and body |
The MailResource
class implements the HTTP API exposed by our application. It handles GET
request on `http://localhost:8080/mail.
So, if in another terminal, you run:
> curl http://localhost:8080/mail
You should see in the application log something like:
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>
As the application runs in dev mode, it simulates the sending of the emails. It prints it in the log, so you can check that what was about to be sent.
This section used the imperative mailer API. It blocks the caller thread until the mail is sent. |
Using the reactive mailer
The last section use the imperative mailer. Quarkus also offers a reactive API.
Mutiny
The reactive mailer uses Mutiny reactive types. If you are not familiar with Mutiny, check Mutiny - an intuitive reactive programming library. |
In the same class, add:
@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 | Inject the reactive mailer. The class to import is io.quarkus.mailer.reactive.ReactiveMailer . |
2 | Configure the path to handle GET request on /mail/reactive . Note that because we are using the reactive API, we don’t need @Blocking |
3 | The method returns a Uni<Void> which completes when the mail is sent. It does not block the caller thread. |
4 | The API is similar to the imperative one except that the send method returns a Uni<Void> . |
Now, in your terminal, run
> curl http://localhost:8080/mail/reactive
You should see in the application log something like:
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>
Configuring the mailer
It’s time to configure the mailer to not simulate the sending of the emails. The Quarkus mailer is using SMTP, so make sure you have access to an SMTP server.
In the src/main/resources/application.properties
file, you need to configure the host, port, username, password as well as the other configuration aspect. Note that the password can also be configured using system properties and environment variables. See the configuration reference guide for details.
Configuration of popular mail services is covered in the reference guide.
Once you have configured the mailer, if you call the HTTP endpoint as shown above, you will send emails.
Conclusion
This guide has shown how to send emails from your Quarkus application. The mailer reference guide provides more details about the mailer usage and configuration such as: