Packages

Elixir client for SendGrid API

Current section

Files

Jump to
send_grid_sender lib mailer mailer.ex
Raw

lib/mailer/mailer.ex

defmodule Mailer do
require Logger
@url "api_url"
@email_from "email"
# def send(template_id, subject, dynamic_template_data, to, env)
# when env in [:dev, :review, :staging],
# do: send(template_id, subject, dynamic_template_data, "email_from")
def send(template_id, subject, dynamic_template_data, to, _env),
do: send(template_id, subject, dynamic_template_data, to)
def send(template_id, subject, dynamic_template_data, to) do
@url
|> HTTPoison.post(body(template_id, subject, dynamic_template_data, to), headers())
|> process_response()
end
def body(template_id, subject, dynamic_template_data, to) do
Jason.encode!(%{
subject: subject,
from: %{email: @email_from},
personalizations: [
%{
to: [%{email: to}],
dynamic_template_data: dynamic_template_data
}
],
template_id: template_id
})
end
defp headers do
[
{"Content-Type", "application/json"},
{"Authorization", "Bearer #{Application.get_env(:app, :sendgrid_api_key)}"}
]
end
defp process_response(
{:ok, %HTTPoison.Response{status_code: 200, body: body, headers: headers}}
) do
{:ok, body, headers}
end
defp process_response(
{:ok, %HTTPoison.Response{status_code: 202, body: body, headers: headers}}
) do
{:ok, body, headers}
end
defp process_response({:ok, %HTTPoison.Response{status_code: code, body: body}}) do
Sentry.capture_message(
"[Sengrid#process_response] status_code: #{code}",
extra: %{extra: "body: #{body}"}
)
{:error, "HttpError Sendgrid. Code: #{code}"}
end
defp process_response({:error, %HTTPoison.Error{reason: reason}}) do
Sentry.capture_message(
"[Sengrid#process_response]",
extra: %{extra: "body: #{reason}"}
)
{:error, "HttpError Sendgrid. Reason: #{reason}"}
end
defp process_response(_) do
{:error, "Unknown error happened"}
end
end