Packages
swoosh
0.4.0
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/sendgrid.ex
defmodule Swoosh.Adapters.Sendgrid do
@moduledoc ~S"""
An adapter that sends email using the Sendgrid API.
For reference: [Sendgrid API docs](https://sendgrid.com/docs/API_Reference/Web_API/mail.htm://sendgrid.com/docs/API_Reference/Web_API/mail.html)
## Example
# config/config.exs
config :sample, Sample.Mailer,
adapter: Swoosh.Adapters.Sendgrid,
api_key: "my-api-key"
# lib/sample/mailer.ex
defmodule Sample.Mailer do
use Swoosh.Mailer, otp_app: :sample
end
"""
use Swoosh.Adapter, required_config: [:api_key]
alias HTTPoison.Response
alias Swoosh.Email
@base_url "https://api.sendgrid.com/api"
@api_endpoint "/mail.send.json"
def deliver(%Email{} = email, config \\ []) do
headers = [{"Content-Type", "application/x-www-form-urlencoded"},
{"User-Agent", "swoosh/#{Swoosh.version}"},
{"Authorization", "Bearer #{config[:api_key]}"}]
body = email |> prepare_body() |> Plug.Conn.Query.encode
case HTTPoison.post(base_url(config) <> @api_endpoint, body, headers) do
{:ok, %Response{status_code: code}} when code >= 200 and code <= 399 ->
{:ok, %{}}
{:ok, %Response{status_code: code, body: body}} when code > 399 ->
{:error, {code, Poison.decode!(body)}}
{:error, %HTTPoison.Error{reason: reason}} ->
{:error, reason}
end
end
defp base_url(config), do: config[:base_url] || @base_url
defp prepare_body(%Email{} = email) do
%{}
|> prepare_from(email)
|> prepare_to(email)
|> prepare_cc(email)
|> prepare_bcc(email)
|> prepare_subject(email)
|> prepare_html_body(email)
|> prepare_text_body(email)
|> prepare_reply_to(email)
end
defp prepare_from(body, %Email{from: {"", address}}), do: Map.put(body, :from, address)
defp prepare_from(body, %Email{from: {name, address}}) do
body
|> Map.put(:from, address)
|> Map.put(:fromname, name)
end
defp prepare_to(body, %Email{to: to}) do
{names, addresses} = Enum.unzip(to)
body
|> prepare_addresses(:to, addresses)
|> prepare_names(:toname, names)
end
defp prepare_cc(body, %Email{cc: []}), do: body
defp prepare_cc(body, %Email{cc: cc}) do
{names, addresses} = Enum.unzip(cc)
body
|> prepare_addresses(:cc, addresses)
|> prepare_names(:ccname, names)
end
defp prepare_bcc(body, %Email{bcc: []}), do: body
defp prepare_bcc(body, %Email{bcc: bcc}) do
{names, addresses} = Enum.unzip(bcc)
body
|> prepare_addresses(:bcc, addresses)
|> prepare_names(:bccname, names)
end
defp prepare_subject(body, %Email{subject: subject}), do: Map.put(body, :subject, subject)
defp prepare_html_body(body, %Email{html_body: nil}), do: body
defp prepare_html_body(body, %Email{html_body: html_body}), do: Map.put(body, :html, html_body)
defp prepare_text_body(body, %Email{text_body: nil}), do: body
defp prepare_text_body(body, %Email{text_body: text_body}), do: Map.put(body, :text, text_body)
defp prepare_reply_to(body, %Email{reply_to: nil}), do: body
defp prepare_reply_to(body, %Email{reply_to: {_name, address}}), do: Map.put(body, :replyto, address)
defp prepare_addresses(body, field, addresses), do: Map.put(body, field, addresses)
defp prepare_names(body, field, names) do
if list_empty?(names), do: body, else: Map.put(body, field, names)
end
defp list_empty?([]), do: true
defp list_empty?(list) do
Enum.all?(list, fn(el) -> el == "" || el == nil end)
end
end