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/sendinblue.ex
defmodule Swoosh.Adapters.Sendinblue do
@moduledoc ~S"""
An adapter that sends email using the Sendinblue API (Transactional emails only).
For reference: [Sendinblue API docs](https://developers.sendinblue.com/reference/sendtransacemail)
**This adapter requires an API Client.** Swoosh comes with Hackney and Finch 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.Sendinblue,
api_key: "my-api-key"
# 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(:id, 42)
|> put_provider_option(:template_id, 42)
|> put_provider_option(:params, %{param1: "a", param2: 123})
|> put_provider_option(:tags, ["tag_1", "tag_2"])
|> put_provider_option(:schedule_at, ~U[2022-11-15 11:00:00Z])
## Provider Options
* `sender_id` (integer) - `sender`, the sender `id` where this library will
add email obtained from the `from/1`
* `template_id` (integer) - `templateId`, the Id of the `active`
transactional email template
* `params` (map) - `params`, a map of key/value attributes to customize the
template
* `tags` (list[string]) - `tags`, a list of tags for each email for easy
filtering
* `schedule_at` (UTC DateTime) - `schedule_at`, a UTC date-time on which the email has to schedule
"""
use Swoosh.Adapter, required_config: [:api_key]
alias Swoosh.Email
@base_url "https://api.sendinblue.com/v3"
@api_endpoint "/smtp/email"
defp base_url(config), do: config[:base_url] || @base_url
@impl true
def deliver(%Email{} = email, config \\ []) do
headers = [
{"Accept", "application/json"},
{"Content-Type", "application/json"},
{"User-Agent", "swoosh/#{Swoosh.version()}"},
{"Api-Key", config[:api_key]}
]
body = email |> prepare_payload() |> Swoosh.json_library().encode!
url = [base_url(config), @api_endpoint]
case Swoosh.ApiClient.post(url, headers, body, email) do
{:ok, code, _headers, body} when code >= 200 and code <= 399 ->
{:ok, %{id: extract_message_id(body)}}
{: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 extract_message_id(body) do
body
|> Swoosh.json_library().decode!()
|> Map.get("messageId")
end
defp prepare_payload(email) do
%{}
|> prepare_from(email)
|> prepare_reply_to(email)
|> prepare_to(email)
|> prepare_cc(email)
|> prepare_bcc(email)
|> prepare_subject(email)
|> prepare_text_content(email)
|> prepare_html_content(email)
|> prepare_template_id(email)
|> prepare_headers(email)
|> prepare_params(email)
|> prepare_tags(email)
|> prepare_attachments(email)
|> prepare_schedule_at(email)
end
defp prepare_from(payload, %{from: {_name, email}, provider_options: %{sender_id: sender_id}}),
do: Map.put(payload, "sender", %{id: sender_id, email: email})
defp prepare_from(payload, %{from: {_, "TEMPLATE"}}), do: payload
defp prepare_from(payload, %{from: from}),
do: Map.put(payload, "sender", prepare_recipient(from))
defp prepare_reply_to(payload, %{reply_to: nil}),
do: payload
defp prepare_reply_to(payload, %{reply_to: reply_to}),
do: Map.put(payload, "replyTo", prepare_recipient(reply_to))
defp prepare_to(payload, %{to: to}) do
Map.put(payload, "to", Enum.map(to, &prepare_recipient/1))
end
defp prepare_cc(payload, %{cc: []}), do: payload
defp prepare_cc(payload, %{cc: cc}) do
Map.put(payload, "cc", Enum.map(cc, &prepare_recipient/1))
end
defp prepare_bcc(payload, %{bcc: []}), do: payload
defp prepare_bcc(payload, %{bcc: bcc}) do
Map.put(payload, "bcc", Enum.map(bcc, &prepare_recipient/1))
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, "textContent", 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, "htmlContent", html_content)
end
defp prepare_template_id(payload, %{provider_options: %{template_id: template_id}}) do
Map.put(payload, "templateId", template_id)
end
defp prepare_template_id(payload, _), do: payload
defp prepare_headers(payload, %{headers: map}) when map_size(map) == 0, do: payload
defp prepare_headers(payload, %{headers: headers}) do
Map.put(payload, "headers", headers)
end
defp prepare_params(payload, %{provider_options: %{params: params}}) when is_map(params) do
Map.put(payload, "params", params)
end
defp prepare_params(payload, _), do: payload
defp prepare_tags(payload, %{provider_options: %{tags: tags}}) when is_list(tags) do
Map.put(payload, "tags", tags)
end
defp prepare_tags(payload, _), do: payload
defp prepare_attachments(payload, %{attachments: []}), do: payload
defp prepare_attachments(payload, %{attachments: attachments}) do
Map.put(
payload,
"attachment",
Enum.map(
attachments,
&%{
name: &1.filename,
content: Swoosh.Attachment.get_content(&1, :base64)
}
)
)
end
defp prepare_schedule_at(payload, %{provider_options: %{schedule_at: schedule_at}}) do
Map.put(payload, "scheduledAt", schedule_at)
end
defp prepare_schedule_at(payload, _), do: payload
defp prepare_recipient({name, email}) when name in [nil, ""],
do: %{email: email}
defp prepare_recipient({name, email}),
do: %{name: name, email: email}
end