See how to send emails in Athenna.
Introduction
Sending email doesn't have to be complicated. Athenna provides a clean, simple email API powered by the popular nodemailer package. Right now Athenna provide drivers for sending email via SMTP only, but in the future we will add support for Mailgun, Mailtrap, Amazon SES, and sendmail.
Installation
First of all you need to install @athenna/mail
package
and configure it. Artisan provides a very simple command to
install and configure the mail library in your project.
Simply run the following:
node artisan install @athenna/mail
The mail configurer will do the following operations in your project:
- Create the
mail.ts
configuration file. - Add all mail providers in your
.athennarc.json
file. - Add mail environment variables to
.env
,.env.test
and.env.example
.
Configuration
Athenna's email services may be configured via your application's
Path.config('mail.ts')
./src/config/mail.ts
Available mail drivers
Each mailer is powered by a "driver". The driver determines how the mail will be transported. The following mail drivers are available in every Athenna application. An entry for most of these drivers is already present in your application's
Path.config('mail.ts')
./src/config/mail.ts
Driver name | Website | Built with |
---|---|---|
smtp | https://nodemailer.com/smtp/ | nodemailer |
Athenna has another driver called fake
that is very helpful when running tests.
The fake
driver got the same signature of all other drivers, but it don't execute
any operation when calling executors methods like send()
, which is perfect to use
within the Mock
class. For more information
about the FakeDriver
, take a look at the
mocking mail documentation section.
Sending mail
Let's see the simplest way to send a mail using Mail facade:
import { Mail } from '@athenna/mail'
await Mail.from('support@athenna.io')
.to('user@gmail.com')
.content('<h1>Mail content</h1>')
.send()
You can add "to", "cc" and "bcc" recipientes by chaining their respective method together:
await Mail.from('support@athenna.io')
.to('user@gmail.com')
.cc('txsoura@athenna.io')
.bcc('support@athenna.io')
.content('<h1>Mail content</h1>')
.send()
Sending mail via a specific mailer
By default, Athenna will send email using the mailer configured
as the default
mailer in your application's mail
configuration
file. However, you may use the mailer()
method to send a message
using a specific mailer configuration:
await Mail.mailer('my-mailer') 👈
.from('support@athenna.io')
.to('lenon@athenna.io')
.content('Mail content')
.send()
Sending Text and Markdown as content
To send text as the content of the mail, you can set the
type
property in second argument:
await Mail.mailer('my-mailer')
.from('support@athenna.io')
.to('lenon@athenna.io')
.content('Mail content', { type: 'text' }) 👈
.send()
And for markdowns you can use the markdown
type:
await Mail.mailer('my-mailer')
.from('support@athenna.io')
.to('lenon@athenna.io')
.content('# Mail content', { type: 'markdown' }) 👈
.send()
Using view template as content
The mail component is integrated with the view component to be
able to render and send a view as the body of the email. To do
so you can use the view()
method of the Mail facade:
const userEmail = 'lenon@athenna.io'
await Mail.from('support@athenna.io')
.to(userEmail)
.cc('mailer1@athenna.io, mailer2@athenna.io')
.bcc('mailer3@athenna.io, mailer4@athenna.io')
.content('This is the mail body')
.view('mail/welcome', { email: userEmail }) 👈
.send()
Any data that you provide using the Mail
facade will be
available to you in your view:
<!-- Provided by you when using Mail facade methods -->
<h1>{{ to }}</h1>
<h1>{{ cc }}</h1>
<h1>{{ bcc }}</h1>
<h1>{{ from }}</h1>
<h1>{{ content }}</h1>
<!-- Provided by you second argument -->
<h1>{{ email }}</h1>
You can overwrite data set by Mail
facade by defining it
in the second argument object:
const userEmail = 'lenon@athenna.io'
await Mail.from('support@athenna.io')
.to(userEmail)
.cc('mailer1@athenna.io, mailer2@athenna.io')
.bcc('mailer3@athenna.io, mailer4@athenna.io')
.content('This is the mail body')
.view('mail/welcome', {
email: userEmail,
to: 'txsoura@athenna.io' 👈
})
.send()
Previewing mail templates in the browser
When designing a mailable's template, it is convenient to quickly
preview the rendered mailable in your browser like a typical
Edge template. For this reason, Athenna allows you to return any
mailable directly from a route using the Route.view()
method,
allowing you to quickly preview its design without needing to
send it to an actual email address:
Route.view('/mailable', 'mail/welcome', { email: 'lenon@athenna.io' })