Packages
swoosh
1.19.1
1.26.3
1.26.2
1.26.1
1.26.0
1.25.3
1.25.2
1.25.1
1.25.0
1.24.0
1.23.1
1.23.0
1.22.1
1.22.0
1.21.0
1.20.1
1.20.0
1.19.9
1.19.8
1.19.7
1.19.6
1.19.5
1.19.4
1.19.3
1.19.2
1.19.1
1.19.0
1.18.4
1.18.3
1.18.2
1.18.1
1.18.0
1.17.10
1.17.9
1.17.8
retired
1.17.7
retired
1.17.6
1.17.5
1.17.4
retired
1.17.3
1.17.2
1.17.1
1.17.0
1.16.12
1.16.11
1.16.10
1.16.9
1.16.8
1.16.7
1.16.6
1.16.5
1.16.4
1.16.3
1.16.2
retired
1.16.1
retired
1.16.0
1.15.3
1.15.2
1.15.1
1.15.0
1.14.4
1.14.3
1.14.2
1.14.1
1.14.0
1.13.0
1.12.0
1.11.6
1.11.5
1.11.4
1.11.3
1.11.2
1.11.1
retired
1.11.0
1.10.3
1.10.2
1.10.1
1.10.0
1.9.1
1.9.0
1.8.3
1.8.2
1.8.1
1.8.0
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.2
1.5.1
1.5.0
1.4.0
1.3.11
1.3.10
1.3.9
1.3.8
retired
1.3.7
1.3.6
retired
1.3.5
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.2
1.2.1
1.2.0
1.1.2
1.1.1
1.1.0
1.0.9
1.0.8
retired
1.0.7
retired
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.25.6
0.25.5
0.25.4
0.25.3
retired
0.25.2
0.25.1
0.25.0
0.24.4
0.24.3
0.24.2
0.24.1
0.24.0
0.23.5
0.23.4
0.23.3
0.23.2
0.23.1
0.23.0
0.22.2
0.22.1
0.22.0
0.21.1
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.1
0.16.0
0.15.0
0.14.0
0.13.0
0.12.1
0.12.0
0.11.0
0.10.0
0.9.1
0.9.0
0.8.1
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
Compose, deliver and test your emails easily in Elixir. Supports SMTP, Sendgrid, Mandrill, Postmark, Mailgun and many more out of the box. Preview your emails in the browser. Test your email sending code.
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/swoosh/adapter.ex
defmodule Swoosh.Adapter do
@moduledoc ~S"""
Specification of the email delivery adapter.
"""
defmacro __using__(opts) do
quote bind_quoted: [opts: opts] do
@required_config opts[:required_config] || []
@required_deps opts[:required_deps] || []
@behaviour Swoosh.Adapter
def validate_config(config) do
Swoosh.Adapter.validate_config(@required_config, config)
end
def validate_dependency do
Swoosh.Adapter.validate_dependency(@required_deps)
end
end
end
@type t :: module
@type email :: Swoosh.Email.t()
@type config :: Keyword.t()
@doc """
Delivers an email with the given config.
"""
@callback deliver(email(), config()) :: {:ok, term} | {:error, term}
@doc """
Delivers multiple emails with the given config in one request. Some email providers allow multiple
messages to be sent in one HTTP request, for example Mailjet and Postmark allow this. Check your
provider's documentation to see if that is possible, and see the adapter you use to find out whether
it has been implemented.
"""
@callback deliver_many(list(email()), config()) ::
{:ok, list(term)} | {:error, term}
@callback validate_config(config()) :: :ok | no_return
@callback validate_dependency() :: :ok | [module | {atom, module}]
@optional_callbacks validate_dependency: 0, deliver_many: 2
@spec validate_config([atom], Keyword.t()) :: :ok | no_return
def validate_config(required_config, config) do
missing_keys =
Enum.reduce(required_config, [], fn key, missing_keys ->
if config[key] in [nil, ""],
do: [key | missing_keys],
else: missing_keys
end)
raise_on_missing_config(missing_keys, config)
end
defp raise_on_missing_config([], _config), do: :ok
defp raise_on_missing_config(key, config) do
raise ArgumentError, """
expected #{inspect(key)} to be set, got: #{inspect(config)}
"""
end
@spec validate_dependency([module | {atom, module}]) ::
:ok | {:error, [module | {:atom | module}]}
def validate_dependency(required_deps) do
if Enum.all?(required_deps, fn
{_lib, module} -> Code.ensure_loaded?(module)
module -> Code.ensure_loaded?(module)
end),
do: :ok,
else: {:error, required_deps}
end
end