defmodule MvWeb.Emails.JoinConfirmationEmail do @moduledoc """ Sends the join request confirmation email (double opt-in) using the unified email layout. """ use Phoenix.Swoosh, view: MvWeb.EmailsView, layout: {MvWeb.EmailLayoutView, "layout.html"} use MvWeb, :verified_routes import Swoosh.Email use Gettext, backend: MvWeb.Gettext, otp_app: :mv alias Mv.Mailer @doc """ Sends the join confirmation email to the given address with the confirmation link. Called from the domain after a JoinRequest is created (submit flow). Returns `{:ok, email}` on success, `{:error, reason}` on delivery failure. Callers should log errors and may still return success for the overall operation (e.g. join request created) so the user is not shown a generic error when only the email failed. """ def send(email_address, token) when is_binary(email_address) and is_binary(token) do confirm_url = url(~p"/confirm_join/#{token}") subject = gettext("Confirm your membership request") assigns = %{ confirm_url: confirm_url, subject: subject, app_name: Mailer.mail_from() |> elem(0), locale: Gettext.get_locale(MvWeb.Gettext) } new() |> from(Mailer.mail_from()) |> to(email_address) |> subject(subject) |> put_view(MvWeb.EmailsView) |> render_body("join_confirmation.html", assigns) |> Mailer.deliver() end end