Current section

Files

Jump to
blossom lib blossom mail.ex
Raw

lib/blossom/mail.ex

defmodule Blossom.Mail do
alias Blossom.Mail
alias Blossom.Controllers.Settings
alias Swoosh.Email
@default_text %{
password_reset:
"Hello <%= user.username %>,\nyour password reset code for <%= organization.name %> is <%= code.code %>\n",
verification:
"Hello <%= user.username %>,\nyour verification code for <%= organization.name %> is <%= code.code %>\n"
}
def default_text(), do: @default_text
def get_adapter(settings) do
provider = Settings.find_value(settings, "mail_provider")
if provider do
Module.concat([Swoosh, Adapters, String.capitalize(provider)])
end
end
def get_api_key(settings) do
Settings.find_value(settings, "mail_api_key")
end
def get_sender(settings) do
Settings.find_value(settings, "mail_sender")
end
def get_text(settings, kind) do
text = Settings.find_value(settings, "mail_#{kind}_text")
if text == nil do
@default_text[kind]
else
text
end
end
def get_html(settings, kind) do
Settings.find_value(settings, "mail_#{kind}_html")
end
def get_config(organization, settings, kind) do
[
adapter: Mail.get_adapter(settings),
api_key: Mail.get_api_key(settings),
domain: organization.domain,
sender: Mail.get_sender(settings),
text: Mail.get_text(settings, kind),
html: Mail.get_html(settings, kind)
]
end
def can_send_mail?(config) do
if config[:adapter] != nil && config[:api_key] != nil do
true
else
false
end
end
def text(email, config, context) do
email
|> Email.text_body(EEx.eval_string(config[:text], context))
end
def html(email, config, context) do
if config[:html] != nil do
email
|> Email.html_body(EEx.eval_string(config[:html], context))
else
email
end
end
def head(config, context) do
Email.new()
|> Email.to({context[:user].username, context[:user].email})
|> Email.from({context[:organization].name, config[:sender]})
end
def build(subject, config, context) do
config
|> Mail.head(context)
|> Email.subject(subject)
|> Mail.text(config, context)
|> Mail.html(config, context)
end
def send(subject, caller, config, context) do
if Mail.can_send_mail?(config) do
subject
|> Mail.build(config, context)
|> caller.deliver(config)
else
{:ok, nil}
end
end
def email_verification(caller, code, user, organization, settings) do
config = Mail.get_config(organization, settings, :verification)
context = [code: code, user: user, organization: organization]
subject = "Verify your email address"
Mail.send(subject, caller, config, context)
end
def password_reset(caller, code, user, organization, settings) do
config = Mail.get_config(organization, settings, :password_reset)
context = [code: code, user: user, organization: organization]
subject = "Reset your password"
Mail.send(subject, caller, config, context)
end
defmacro __using__(opts \\ []) do
quote do
@opts unquote(opts)
@caller unquote(__CALLER__.module)
use Swoosh.Mailer, otp_app: @opts[:otp_app]
alias Swoosh.Email
def email_verification(code, user, organization, settings) do
Mail.email_verification(@caller, code, user, organization, settings)
end
def password_reset(code, user, organization, settings) do
Mail.password_reset(@caller, code, user, organization, settings)
end
end
end
end