Packages
swoosh
1.10.1
1.26.3
1.26.2
1.26.1
1.26.0
1.25.3
1.25.2
1.25.1
1.25.0
1.24.0
1.23.1
1.23.0
1.22.1
1.22.0
1.21.0
1.20.1
1.20.0
1.19.9
1.19.8
1.19.7
1.19.6
1.19.5
1.19.4
1.19.3
1.19.2
1.19.1
1.19.0
1.18.4
1.18.3
1.18.2
1.18.1
1.18.0
1.17.10
1.17.9
1.17.8
retired
1.17.7
retired
1.17.6
1.17.5
1.17.4
retired
1.17.3
1.17.2
1.17.1
1.17.0
1.16.12
1.16.11
1.16.10
1.16.9
1.16.8
1.16.7
1.16.6
1.16.5
1.16.4
1.16.3
1.16.2
retired
1.16.1
retired
1.16.0
1.15.3
1.15.2
1.15.1
1.15.0
1.14.4
1.14.3
1.14.2
1.14.1
1.14.0
1.13.0
1.12.0
1.11.6
1.11.5
1.11.4
1.11.3
1.11.2
1.11.1
retired
1.11.0
1.10.3
1.10.2
1.10.1
1.10.0
1.9.1
1.9.0
1.8.3
1.8.2
1.8.1
1.8.0
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.2
1.5.1
1.5.0
1.4.0
1.3.11
1.3.10
1.3.9
1.3.8
retired
1.3.7
1.3.6
retired
1.3.5
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.2
1.2.1
1.2.0
1.1.2
1.1.1
1.1.0
1.0.9
1.0.8
retired
1.0.7
retired
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.25.6
0.25.5
0.25.4
0.25.3
retired
0.25.2
0.25.1
0.25.0
0.24.4
0.24.3
0.24.2
0.24.1
0.24.0
0.23.5
0.23.4
0.23.3
0.23.2
0.23.1
0.23.0
0.22.2
0.22.1
0.22.0
0.21.1
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.1
0.16.0
0.15.0
0.14.0
0.13.0
0.12.1
0.12.0
0.11.0
0.10.0
0.9.1
0.9.0
0.8.1
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
Compose, deliver and test your emails easily in Elixir. Supports SMTP, Sendgrid, Mandrill, Postmark, Mailgun and many more out of the box. Preview your emails in the browser. Test your email sending code.
Current section
Files
Jump to
Current section
Files
lib/swoosh/adapters/smtp.ex
defmodule Swoosh.Adapters.SMTP do
@moduledoc ~S"""
An adapter that sends email using the SMTP protocol.
Underneath this adapter uses the
[gen_smtp](https://github.com/gen-smtp/gen_smtp) library, add it to your mix.exs file.
## Example
# mix.exs
def deps do
[
{:swoosh, "~> 1.3"},
{:gen_smtp, "~> 1.1"}
]
end
# config/config.exs
config :sample, Sample.Mailer,
adapter: Swoosh.Adapters.SMTP,
relay: "smtp.avengers.com",
username: "tonystark",
password: "ilovepepperpotts",
ssl: true,
tls: :always,
auth: :always,
port: 1025,
dkim: [
s: "default", d: "domain.com",
private_key: {:pem_plain, File.read!("priv/keys/domain.private")}
],
retries: 2,
no_mx_lookups: false
# lib/sample/mailer.ex
defmodule Sample.Mailer do
use Swoosh.Mailer, otp_app: :sample
end
## Note
With `STARTTLS` you should omit the ssl configuration or set it to false.
For more details, please see [gen_smtp docs](https://hexdocs.pm/gen_smtp/readme.html)
"""
use Swoosh.Adapter, required_config: [:relay], required_deps: [gen_smtp: :gen_smtp_client]
alias Swoosh.Email
alias Swoosh.Adapters.SMTP.Helpers
@impl true
def deliver(%Email{} = email, config) do
sender = Helpers.sender(email)
recipients = all_recipients(email)
body = Helpers.body(email, config)
case :gen_smtp_client.send_blocking(
{sender, recipients, body},
gen_smtp_config(config)
) do
receipt when is_binary(receipt) -> {:ok, receipt}
{:error, type, message} -> {:error, {type, message}}
{:error, reason} -> {:error, reason}
end
end
@config_transformations %{
port: &String.to_integer/1,
retries: &String.to_integer/1,
ssl: {&String.to_atom/1, [true, false]},
tls: {&String.to_atom/1, [:always, :never, :if_available]},
auth: {&String.to_atom/1, [:always, :never, :if_available]},
no_mx_lookups: {&String.to_atom/1, [true, false]}
}
@config_keys Map.keys(@config_transformations)
def gen_smtp_config(config) do
Enum.map(config, fn {key, value} -> enforce_type!(key, value) end)
end
defp enforce_type!(key, value) when key in @config_keys and is_binary(value) do
case Map.get(@config_transformations, key) do
{func, valid_values} ->
value = func.(value)
if value in valid_values do
{key, value}
else
raise ArgumentError, """
#{key} is not configured properly,
got: #{value}, expected one of the following:
#{valid_values |> Enum.map_join(", ", &inspect/1)}
"""
end
func ->
{key, func.(value)}
end
end
defp enforce_type!(key, value)
when key in [:username, :password, :relay] and not is_binary(value) do
raise ArgumentError, """
#{key} is not configured properly,
got: #{inspect(value)}, expected a string
"""
end
defp enforce_type!(key, value), do: {key, value}
defp all_recipients(email) do
[email.to, email.cc, email.bcc]
|> Enum.concat()
|> Enum.map(fn {_name, address} -> address end)
|> Enum.uniq()
end
end