[#1149] Addressed code review comments (code style, jobs pruning etc.).
[akkoma] / lib / pleroma / emails / mailer.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Emails.Mailer do
6 @moduledoc """
7 Defines the Pleroma mailer.
8
9 The module contains functions to delivery email using Swoosh.Mailer.
10 """
11
12 alias Pleroma.Repo
13 alias Pleroma.Workers.MailerWorker
14 alias Swoosh.DeliveryError
15
16 @otp_app :pleroma
17 @mailer_config [otp: :pleroma]
18
19 @spec enabled?() :: boolean()
20 def enabled?, do: Pleroma.Config.get([__MODULE__, :enabled])
21
22 import Pleroma.Workers.WorkerHelper, only: [worker_args: 1]
23
24 @doc "add email to queue"
25 def deliver_async(email, config \\ []) do
26 encoded_email =
27 email
28 |> :erlang.term_to_binary()
29 |> Base.encode64()
30
31 %{"op" => "email", "encoded_email" => encoded_email, "config" => config}
32 |> MailerWorker.new(worker_args(:mailer))
33 |> Repo.insert()
34 end
35
36 @doc "callback to perform send email from queue"
37 def perform(:deliver_async, email, config), do: deliver(email, config)
38
39 @spec deliver(Swoosh.Email.t(), Keyword.t()) :: {:ok, term} | {:error, term}
40 def deliver(email, config \\ [])
41
42 def deliver(email, config) do
43 case enabled?() do
44 true -> Swoosh.Mailer.deliver(email, parse_config(config))
45 false -> {:error, :deliveries_disabled}
46 end
47 end
48
49 @spec deliver!(Swoosh.Email.t(), Keyword.t()) :: term | no_return
50 def deliver!(email, config \\ [])
51
52 def deliver!(email, config) do
53 case deliver(email, config) do
54 {:ok, result} -> result
55 {:error, reason} -> raise DeliveryError, reason: reason
56 end
57 end
58
59 @on_load :validate_dependency
60
61 @doc false
62 def validate_dependency do
63 parse_config([])
64 |> Keyword.get(:adapter)
65 |> Swoosh.Mailer.validate_dependency()
66 end
67
68 defp parse_config(config) do
69 Swoosh.Mailer.parse_config(@otp_app, __MODULE__, @mailer_config, config)
70 end
71 end