Packages
swoosh
1.19.7
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.
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/swoosh/adapters/lettermint.ex
defmodule Swoosh.Adapters.Lettermint do
@moduledoc ~S"""
An adapter that sends email using the Lettermint API.
For reference: [Lettermint API docs](https://docs.lettermint.co/api-reference/endpoint/send)
**This adapter requires an API Client.** Swoosh comes with Hackney, Finch and Req out of the box.
See the [installation section](https://hexdocs.pm/swoosh/Swoosh.html#module-installation)
for details.
## Example
# config/config.exs
config :sample, Sample.Mailer,
adapter: Swoosh.Adapters.Lettermint,
api_token: "my-api-token"
# lib/sample/mailer.ex
defmodule Sample.Mailer do
use Swoosh.Mailer, otp_app: :sample
end
## Using with provider options
import Swoosh.Email
new()
|> from("nora@example.com")
|> to("shushu@example.com")
|> subject("Hello, Wally!")
|> text_body("Hello")
|> put_provider_option(:metadata, %{campaign: "welcome"})
|> put_provider_option(:idempotency_key, "unique-key-123")
## Provider Options
* `metadata` (map) - Custom tracking metadata
* `idempotency_key` (string) - Unique key to prevent duplicate sends
"""
use Swoosh.Adapter, required_config: [:api_token]
alias Swoosh.Email
@base_url "https://api.lettermint.co/v1"
@api_endpoint "/send"
defp base_url(config), do: config[:base_url] || @base_url
def deliver(%Email{} = email, config \\ []) do
headers = prepare_headers(config, email)
body = email |> prepare_payload() |> Swoosh.json_library().encode!
url = [base_url(config), @api_endpoint]
case Swoosh.ApiClient.post(url, headers, body, email) do
{:ok, 202, _headers, body} ->
case Swoosh.json_library().decode(body) do
{:ok, %{"message_id" => message_id, "status" => status}} ->
{:ok, %{id: message_id, status: status}}
{:ok, response} ->
{:ok, %{id: Map.get(response, "message_id"), status: Map.get(response, "status")}}
{:error, _} ->
{:error, {202, body}}
end
{:ok, code, _headers, body} when code >= 400 ->
case Swoosh.json_library().decode(body) do
{:ok, error} -> {:error, {code, error}}
{:error, _} -> {:error, {code, body}}
end
{:error, reason} ->
{:error, reason}
end
end
defp prepare_headers(config, email) do
base_headers = [
{"Accept", "application/json"},
{"Content-Type", "application/json"},
{"User-Agent", "swoosh/#{Swoosh.version()}"},
{"x-lettermint-token", config[:api_token]}
]
case get_idempotency_key(email) do
nil -> base_headers
key -> [{"Idempotency-Key", key} | base_headers]
end
end
defp get_idempotency_key(%{provider_options: %{idempotency_key: key}}), do: key
defp get_idempotency_key(_), do: nil
defp prepare_payload(email) do
%{}
|> prepare_from(email)
|> prepare_to(email)
|> prepare_cc(email)
|> prepare_bcc(email)
|> prepare_reply_to(email)
|> prepare_subject(email)
|> prepare_text_content(email)
|> prepare_html_content(email)
|> prepare_email_headers(email)
|> prepare_metadata(email)
|> prepare_attachments(email)
end
defp prepare_from(payload, %{from: from}), do: Map.put(payload, "from", format_email(from))
defp prepare_to(payload, %{to: to}) do
Map.put(payload, "to", Enum.map(to, &format_email/1))
end
defp prepare_cc(payload, %{cc: []}), do: payload
defp prepare_cc(payload, %{cc: cc}) do
Map.put(payload, "cc", Enum.map(cc, &format_email/1))
end
defp prepare_bcc(payload, %{bcc: []}), do: payload
defp prepare_bcc(payload, %{bcc: bcc}) do
Map.put(payload, "bcc", Enum.map(bcc, &format_email/1))
end
defp prepare_reply_to(payload, %{reply_to: nil}), do: payload
defp prepare_reply_to(payload, %{reply_to: reply_to}) do
Map.put(payload, "reply_to", [format_email(reply_to)])
end
defp prepare_subject(payload, %{subject: ""}), do: payload
defp prepare_subject(payload, %{subject: subject}),
do: Map.put(payload, "subject", subject)
defp prepare_subject(payload, _), do: payload
defp prepare_text_content(payload, %{text_body: nil}), do: payload
defp prepare_text_content(payload, %{text_body: text_content}) do
Map.put(payload, "text", text_content)
end
defp prepare_html_content(payload, %{html_body: nil}), do: payload
defp prepare_html_content(payload, %{html_body: html_content}) do
Map.put(payload, "html", html_content)
end
defp prepare_email_headers(payload, %{headers: map}) when map_size(map) == 0, do: payload
defp prepare_email_headers(payload, %{headers: headers}) do
Map.put(payload, "headers", headers)
end
defp prepare_metadata(payload, %{provider_options: %{metadata: metadata}})
when is_map(metadata) do
Map.put(payload, "metadata", metadata)
end
defp prepare_metadata(payload, _), do: payload
defp prepare_attachments(payload, %{attachments: []}), do: payload
defp prepare_attachments(payload, %{attachments: attachments}) do
Map.put(
payload,
"attachments",
Enum.map(
attachments,
&%{
filename: &1.filename,
content: Swoosh.Attachment.get_content(&1, :base64)
}
)
)
end
defp format_email({name, email}) when name in [nil, ""], do: email
defp format_email({name, email}), do: "#{name} <#{email}>"
defp format_email(email) when is_binary(email), do: email
end