diff --git a/lib/keila/mailings/mailings.ex b/lib/keila/mailings/mailings.ex index 9f08cb14..0f50778c 100644 --- a/lib/keila/mailings/mailings.ex +++ b/lib/keila/mailings/mailings.ex @@ -56,6 +56,25 @@ defmodule Keila.Mailings do :ok end + @doc """ + Tests if emails can be sent from Sender credentials with given ID. + """ + @spec try_credentials(Sender.id()) :: {:ok, Sender.t()} | {:error, term()} + def try_credentials(id) when is_id(id) do + sender = get_sender(id) + + email = %Swoosh.Email{ + to: [{"", "sender-test@keila.io"}], + from: {sender.from_name, sender.from_email}, + text_body: "Testing sender #{sender.id}" + } + + case Keila.Mailer.deliver(email, Sender.Config.to_swoosh_config(sender.config)) do + {:ok, _} -> {:ok, sender} + {:error, reason} -> {:error, reason} + end + end + @doc """ Retrieves Campaign with given `id`. """ diff --git a/lib/keila_web/controllers/sender_controller.ex b/lib/keila_web/controllers/sender_controller.ex index a678152f..0fa7c3b8 100644 --- a/lib/keila_web/controllers/sender_controller.ex +++ b/lib/keila_web/controllers/sender_controller.ex @@ -15,23 +15,6 @@ defmodule KeilaWeb.SenderController do |> render("index.html") end - @spec edit(Plug.Conn.t(), map()) :: Plug.Conn.t() - def edit(conn, _params) do - conn - |> put_meta(:title, conn.assigns.sender.name) - |> render_edit(Ecto.Changeset.change(conn.assigns.sender)) - end - - @spec post_edit(Plug.Conn.t(), map()) :: Plug.Conn.t() - def post_edit(conn, params = %{"id" => id}) do - project = current_project(conn) - - case Mailings.update_sender(id, params["sender"] || %{}) do - {:ok, _sender} -> redirect(conn, to: Routes.sender_path(conn, :index, project.id)) - {:error, changeset} -> render_edit(conn, 400, changeset) - end - end - @spec new(Plug.Conn.t(), map()) :: Plug.Conn.t() def new(conn, _) do changeset = @@ -47,7 +30,22 @@ defmodule KeilaWeb.SenderController do project = current_project(conn) case Mailings.create_sender(project.id, params) do - {:ok, _} -> redirect(conn, to: Routes.sender_path(conn, :index, project.id)) + {:ok, sender} -> try_credentials_and_redirect(conn, sender) + {:error, changeset} -> render_edit(conn, 400, changeset) + end + end + + @spec edit(Plug.Conn.t(), map()) :: Plug.Conn.t() + def edit(conn, _params) do + conn + |> put_meta(:title, conn.assigns.sender.name) + |> render_edit(Ecto.Changeset.change(conn.assigns.sender)) + end + + @spec post_edit(Plug.Conn.t(), map()) :: Plug.Conn.t() + def post_edit(conn, params = %{"id" => id}) do + case Mailings.update_sender(id, params["sender"] || %{}) do + {:ok, sender} -> try_credentials_and_redirect(conn, sender) {:error, changeset} -> render_edit(conn, 400, changeset) end end @@ -59,6 +57,25 @@ defmodule KeilaWeb.SenderController do |> render("edit.html") end + defp try_credentials_and_redirect(conn, sender) do + project = current_project(conn) + + case Mailings.try_credentials(sender.id) do + {:ok, _sender} -> + redirect(conn, to: Routes.sender_path(conn, :index, project.id)) + + _ -> + conn + |> put_flash( + :error, + gettext( + "Sender settings were saved but Keila was unable to send a test email with your provided credentials." + ) + ) + |> redirect(to: Routes.sender_path(conn, :index, project.id)) + end + end + @spec delete(Plug.Conn.t(), any) :: Plug.Conn.t() def delete(conn, _) do sender = conn.assigns.sender diff --git a/lib/keila_web/controllers/template_controller.ex b/lib/keila_web/controllers/template_controller.ex index 24e9a762..39318c30 100644 --- a/lib/keila_web/controllers/template_controller.ex +++ b/lib/keila_web/controllers/template_controller.ex @@ -7,9 +7,6 @@ defmodule KeilaWeb.TemplateController do plug :authorize when not (action in [:index, :new, :post_new, :delete]) - @default_text_body File.read!("priv/email_templates/default-text-content.txt") - @default_markdown_body File.read!("priv/email_templates/default-markdown-content.md") - @spec index(Plug.Conn.t(), map()) :: Plug.Conn.t() def index(conn, _params) do templates = Templates.get_project_templates(current_project(conn).id) diff --git a/lib/keila_web/endpoint.ex b/lib/keila_web/endpoint.ex index 66f2aaae..ceb0c2eb 100644 --- a/lib/keila_web/endpoint.ex +++ b/lib/keila_web/endpoint.ex @@ -24,8 +24,7 @@ defmodule KeilaWeb.Endpoint do at: "/", from: :keila, gzip: false, - only: - ~w(css fonts images js favicon.ico robots.txt keila_import_template.csv keila_import_template.ods) + only: ~w(css fonts images js downloads favicon.ico robots.txt) # Code reloading can be explicitly enabled under the # :code_reloader configuration of your endpoint. diff --git a/lib/keila_web/templates/layout/app.html.eex b/lib/keila_web/templates/layout/app.html.eex index cc897a8b..bab5b91a 100644 --- a/lib/keila_web/templates/layout/app.html.eex +++ b/lib/keila_web/templates/layout/app.html.eex @@ -3,7 +3,7 @@
<%= get_flash(@conn, :info) %>
<% end %> -<%= if get_flash(@conn, :errors) do %> +<%= if get_flash(@conn, :error) do %><%= get_flash(@conn, :error) %>