diff --git a/config/prod.exs b/config/prod.exs index 1e242e2..0f1d77a 100644 --- a/config/prod.exs +++ b/config/prod.exs @@ -53,3 +53,14 @@ config :form, FormWeb.Endpoint, force_ssl: [rewrite_on: [:x_forwarded_proto]] # # Check `Plug.SSL` for all available options in `force_ssl`. + +# Email provider +sendgrid_api_key = + System.get_env("SENDGRID_API_KEY") || + raise """ + environment variable SENDGRID_API_KEY is missing. + """ + +config :form, FormWeb.Pow.Mailer, + adapter: Swoosh.Adapters.Sendgrid, + api_key: sendgrid_api_key diff --git a/lib/form_web/pow_mailer.ex b/lib/form_web/pow_mailer.ex index 905655a..28ca94c 100644 --- a/lib/form_web/pow_mailer.ex +++ b/lib/form_web/pow_mailer.ex @@ -1,16 +1,41 @@ defmodule FormWeb.Pow.Mailer do use Pow.Phoenix.Mailer + use Swoosh.Mailer, otp_app: :form + + import Swoosh.Email + require Logger - def cast(%{user: user, subject: subject, text: text, html: html, assigns: _assigns}) do - # Build email struct to be used in `process/1` + @impl true + def cast(%{user: user, subject: subject, text: text, html: html}) do + %Swoosh.Email{} + |> to({"", user.email}) + |> from({"My App", "myapp@example.com"}) + |> subject(subject) + |> html_body(html) + |> text_body(text) - %{to: user.email, subject: subject, text: text, html: html} + # end end + @impl true def process(email) do - # Send email - Logger.debug("E-mail sent: #{inspect(email)}") + + if Mix.env() == :prod do + Task.start(fn -> + email + |> deliver() + |> log_warnings() + end) + + :ok + end + end + + defp log_warnings({:error, reason}) do + Logger.warn("Mailer backend failed with: #{inspect(reason)}") end + + defp log_warnings({:ok, response}), do: {:ok, response} end diff --git a/mix.exs b/mix.exs index 1b7de01..8e49a49 100644 --- a/mix.exs +++ b/mix.exs @@ -43,13 +43,15 @@ defmodule Form.MixProject do {:floki, ">= 0.30.0", only: :test}, {:phoenix_live_dashboard, "~> 0.6"}, {:esbuild, "~> 0.3", runtime: Mix.env() == :dev}, - {:swoosh, "~> 1.3"}, {:telemetry_metrics, "~> 0.6"}, {:telemetry_poller, "~> 1.0"}, {:gettext, "~> 0.18"}, {:jason, "~> 1.2"}, {:plug_cowboy, "~> 2.5"}, + # auth provider {:pow, "~> 1.0.26"}, + # email provider + {:swoosh, "~> 1.5"}, ] end