Create pleroma.email mix task
authorHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Mon, 20 Jan 2020 12:23:21 +0000 (13:23 +0100)
committerHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Tue, 28 Jan 2020 15:49:38 +0000 (16:49 +0100)
Closes: https://git.pleroma.social/pleroma/pleroma/issues/1061
CHANGELOG.md
docs/administration/CLI_tasks/email.md [new file with mode: 0644]
lib/mix/tasks/pleroma/email.ex [new file with mode: 0644]
lib/pleroma/emails/admin_email.ex
test/tasks/email_test.exs [new file with mode: 0644]

index 8d9f7d1b5e844b23e085f3acf05b2aacfb05356b..3b3cc5a86b7273df61e7c205bd35db771fdafe18 100644 (file)
@@ -57,6 +57,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - Static Frontend: Add the ability to render user profiles and notices server-side without requiring JS app.
 - Mix task to re-count statuses for all users (`mix pleroma.count_statuses`)
 - Mix task to list all users (`mix pleroma.user list`)
+- Mix task to send a test email (`mix pleroma.email test`)
 - Support for `X-Forwarded-For` and similar HTTP headers which used by reverse proxies to pass a real user IP address to the backend. Must not be enabled unless your instance is behind at least one reverse proxy (such as Nginx, Apache HTTPD or Varnish Cache).
 - MRF: New module which handles incoming posts based on their age. By default, all incoming posts that are older than 2 days will be unlisted and not shown to their followers.
 - User notification settings: Add `privacy_option` option.
diff --git a/docs/administration/CLI_tasks/email.md b/docs/administration/CLI_tasks/email.md
new file mode 100644 (file)
index 0000000..7b7a845
--- /dev/null
@@ -0,0 +1,24 @@
+# Managing emails
+
+{! backend/administration/CLI_tasks/general_cli_task_info.include !}
+
+## Send test email (instance email by default)
+
+```sh tab="OTP"
+ ./bin/pleroma_ctl email test [--to <destination email address>]
+```
+
+```sh tab="From Source"
+mix pleroma.email test [--to <destination email address>]
+```
+
+
+Example: 
+
+```sh tab="OTP"
+./bin/pleroma_ctl email test --to root@example.org
+```
+
+```sh tab="From Source"
+mix pleroma.email test --to root@example.org
+```
diff --git a/lib/mix/tasks/pleroma/email.ex b/lib/mix/tasks/pleroma/email.ex
new file mode 100644 (file)
index 0000000..2c38014
--- /dev/null
@@ -0,0 +1,25 @@
+defmodule Mix.Tasks.Pleroma.Email do
+  use Mix.Task
+
+  @shortdoc "Simple Email test"
+  @moduledoc File.read!("docs/administration/CLI_tasks/email.md")
+
+  def run(["test" | args]) do
+    Mix.Pleroma.start_pleroma()
+
+    {options, [], []} =
+      OptionParser.parse(
+        args,
+        strict: [
+          to: :string
+        ]
+      )
+
+    email = Pleroma.Emails.AdminEmail.test_email(options[:to])
+    {:ok, _} = Pleroma.Emails.Mailer.deliver(email)
+
+    Mix.shell().info(
+      "Test email has been sent to #{inspect(email.to)} from #{inspect(email.from)}"
+    )
+  end
+end
index b15e4041bd4295d17d3a6a5124748ff87c60778a..b3623d3e4efd94a488230b95c1010f054b5f58e7 100644 (file)
@@ -7,6 +7,7 @@ defmodule Pleroma.Emails.AdminEmail do
 
   import Swoosh.Email
 
+  alias Pleroma.Config
   alias Pleroma.Web.Router.Helpers
 
   defp instance_config, do: Pleroma.Config.get(:instance)
@@ -20,6 +21,19 @@ defmodule Pleroma.Emails.AdminEmail do
     Helpers.feed_url(Pleroma.Web.Endpoint, :feed_redirect, user.id)
   end
 
+  def test_email(mail_to \\ nil) do
+    html_body = """
+    <h3>Instance Test Email</h3>
+    <p>A test email was requested. Hello. :)</p>
+    """
+
+    new()
+    |> to(mail_to || Config.get([:instance, :email]))
+    |> from({instance_name(), instance_notify_email()})
+    |> subject("Instance Test Email")
+    |> html_body(html_body)
+  end
+
   def report(to, reporter, account, statuses, comment) do
     comment_html =
       if comment do
diff --git a/test/tasks/email_test.exs b/test/tasks/email_test.exs
new file mode 100644 (file)
index 0000000..944c070
--- /dev/null
@@ -0,0 +1,52 @@
+defmodule Mix.Tasks.Pleroma.EmailTest do
+  use Pleroma.DataCase
+
+  import Swoosh.TestAssertions
+
+  alias Pleroma.Config
+  alias Pleroma.Tests.ObanHelpers
+
+  setup_all do
+    Mix.shell(Mix.Shell.Process)
+
+    on_exit(fn ->
+      Mix.shell(Mix.Shell.IO)
+    end)
+
+    :ok
+  end
+
+  describe "pleroma.email test" do
+    test "Sends test email with no given address" do
+      mail_to = Config.get([:instance, :email])
+
+      :ok = Mix.Tasks.Pleroma.Email.run(["test"])
+
+      ObanHelpers.perform_all()
+
+      assert_receive {:mix_shell, :info, [message]}
+      assert message =~ "Test email has been sent"
+
+      assert_email_sent(
+        to: mail_to,
+        html_body: ~r/a test email was requested./i
+      )
+    end
+
+    test "Sends test email with given address" do
+      mail_to = "hewwo@example.com"
+
+      :ok = Mix.Tasks.Pleroma.Email.run(["test", "--to", mail_to])
+
+      ObanHelpers.perform_all()
+
+      assert_receive {:mix_shell, :info, [message]}
+      assert message =~ "Test email has been sent"
+
+      assert_email_sent(
+        to: mail_to,
+        html_body: ~r/a test email was requested./i
+      )
+    end
+  end
+end