Email delivery is a critical function of most web applications in the world today. I've managed an email server in the past - and trust me - it's not fun or easy to do for a developer that isn't as familiar with the infrastructure side of things. Thankfully, Oracle Cloud Infrastructure (OCI) offers an email delivery service that provides a managed solution for sending high-volume emails without setting up and managing an SMTP server. My favorite Java framework, Micronaut, recently released the Micronaut Email module that supports sending email in your applications. This release inspired me to see what it would take to use OCI email delivery in a Micronaut application. As usual, it's pretty straightforward. So let's see what it takes!
If you've not yet configured a user for email delivery, you'll need to take care of that first. Normally, I'd walk you through that process, but in this case, I think the docs do an excellent job of keeping things concise, so I'll link to them here instead. Here are the steps you'll need to take:
We'll need to collect our username, password, and SMTP endpoint before moving on to the next step.
Now that we have the appropriate credentials and setup complete, we can move on to adding the Micronaut module to our application and configuring it to get ready to send emails.
We'll need the following dependencies to enable our Micronaut application to send emails. If you don't want to use templates, you could exclude the last two dependencies, but I'm going to include them since I'll be showing how to use templates.
Tip! You can choose any of the template engines that are supported by Micronaut Views for email templates!
We can specify a default sender for all emails by setting one into our configuration at /src/main/resources/application.yml
:
Note! The default email sender must be an "approved sender" in the OCI email delivery service!
Next, we will need to configure a MailPropertiesProvider
. Creating the provider is accomplished via configuration settings in our application.yml
file (located at /src/main/resources
). The necessary configuration to generate the provider is below. Note that we'll set the host value externally in just a bit.
A SessionProvider
is also necessary. For this, we'll create a class that implements SessionProvider
and within the session()
method, we'll create and return an instance of PasswordAuthentication
. We will pass the username and password via the constructor. Again, we'll set those values via external configuration in the next section of this blog post.
You could hardcode your credentials into your configuration files, but that would be a bad idea. It's so bad that I don't even do that for simple local demos anymore. We must insist on consistently enforcing security practices in our applications. So, if we're not hardcoding them, how can we get them into the app? Well, one way is to set them into Java system properties. Another option is to set them into environment variables. Micronaut can translate a specifically constructed environment variable or system property into the proper configuration value. If you're not familiar with this feature, I suggest that you read about it in the Application Configuration section of the docs. So, to pass in the credentials, I set the following environment variables in my IDE:
At this point, we're ready to inject the Micronaut EmailSender
into our application and use it to send email messages. I've created a controller to test this out and inject the EmailSender
like so:
To send an email, use the Email
builder:
To test this, hit the /email
endpoint:
Checking the inbox where we sent the message will confirm the message delivery.
To send an email using a Thymeleaf template, create a template at /src/main/resources/views/email.html
and populate it like so:
Create an endpoint:
Send an email by requesting the /email/template
endpoint and pass the value for /{name}
like so:
And check the inbox:
To send a message with an attachment, create a POST
endpoint located at /email/attachment
that consumes a multipart form.
And POST
a request to the /email/attachment
endpoint that includes a file:
Check the inbox:
This post looked at how to use OCI email delivery in a Micronaut application to send text-based and templated email messages. We also learned how to send emails with attachments with the EmailSender
. As always, you can refer to the project on GitHub for the full source code used in this demo.
I've written many blog posts about connecting to an Autonomous DB instance in the past. Best practices evolve as tools, services, and frameworks become...
In my last post, we looked at the technical aspects of my Brain to the Cloud project including much of the code that was used to collect and analyze the...
In my last post, we went over the inspiration, objectives, and architecture for my Brain to the Cloud project. In this post, we'll look in-depth at the...