Swoosh.Mailer (Swoosh v1.19.8)
View SourceDefines a mailer.
A mailer is a wrapper around an adapter that makes it easy for you to swap the adapter without having to change your code.
It is also responsible for doing some sanity checks before handing down the email to the adapter.
When used, the mailer expects :otp_app as an option.
The :otp_app should point to an OTP application that has the mailer
configuration. For example, the mailer:
defmodule Sample.Mailer do
use Swoosh.Mailer, otp_app: :sample
endCould be configured with:
config :sample, Sample.Mailer,
adapter: Swoosh.Adapters.Sendgrid,
api_key: "SG.x.x"Most of the configuration that goes into the config is specific to the adapter, so check the adapter's documentation for more information.
Per module configuration is also supported, it has priority over mix configs:
defmodule Sample.Mailer do
use Swoosh.Mailer, otp_app: :sample,
adapter: Swoosh.Adapters.Sendgrid,
api_key: "SG.x.x"
endUsage
Once configured you can use your mailer like this:
# in an IEx console
iex> email = new |> from("tony.stark@example.com") |> to("steve.rogers@example.com")
%Swoosh.Email{from: {"", "tony.stark@example.com"}, ...}
iex> Mailer.deliver(email)
{:ok, %{...}}Dynamic config
You can also pass an extra config argument to deliver/2 that will be merged
with your Mailer's config:
# in an IEx console
iex> email = new |> from("tony.stark@example.com") |> to("steve.rogers@example.com")
%Swoosh.Email{from: {"", "tony.stark@example.com"}, ...}
iex> Mailer.deliver(email, domain: "jarvis.com")
{:ok, %{...}}Telemetry
Each mailer outputs the following telemetry events:
[:swoosh, :deliver, :start]: occurs whenMailer.deliver/2begins.[:swoosh, :deliver, :stop]: occurs whenMailer.deliver/2completes.[:swoosh, :deliver, :exception]: occurs whenMailer.deliver/2throws an exception.[:swoosh, :deliver_many, :start]: occurs whenMailer.deliver_many/2begins.[:swoosh, :deliver_many, :stop]: occurs whenMailer.deliver_many/2completes.[:swoosh, :deliver_many, :exception]: occurs whenMailer.deliver_many/2throws an exception.
Capturing events
You can capture events by calling :telemetry.attach/4 or :telemetry.attach_many/4. Here's an example:
# tracks the number of emails sent successfully/errored
defmodule MyHandler do
def handle_event([:swoosh, :deliver, :stop], _measurements, metadata, _config) do
if Map.get(metadata, :error) do
StatsD.increment("mail.sent.failure", 1, %{mailer: metadata.mailer})
else
StatsD.increment("mail.sent.success", 1, %{mailer: metadata.mailer})
end
end
def handle_event([:swoosh, :deliver, :exception], _measurements, metadata, _config) do
StatsD.increment("mail.sent.failure", 1, %{mailer: metadata.mailer})
end
def handle_event([:swoosh, :deliver_many, :stop], _measurements, metadata, _config) do
if Map.get(metadata, :error) do
StatsD.increment("mail.sent.failure", length(metadata.emails), %{mailer: metadata.mailer})
else
StatsD.increment("mail.sent.success", length(metadata.emails), %{mailer: metadata.mailer})
end
end
def handle_event([:swoosh, :deliver_many, :exception], _measurements, metadata, _config) do
StatsD.increment("mail.sent.failure", length(metadata.emails), %{mailer: metadata.mailer})
end
endin Application.start/2 callback:
:telemetry.attach_many("my-handler", [
[:swoosh, :deliver, :stop],
[:swoosh, :deliver, :exception],
[:swoosh, :deliver_many, :stop],
[:swoosh, :deliver_many, :exception],
], &MyHandler.handle_event/4, nil)
Summary
Functions
Delivers an email.
The implementation for deliver_many/2 is on case-by-case basis. Check the adapter that you use
to see if it has deliver_many/2 implemented.
Functions
Delivers an email.
The implementation for deliver_many/2 is on case-by-case basis. Check the adapter that you use
to see if it has deliver_many/2 implemented.