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