Packages
swoosh
1.3.11
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.
Current section
Files
Jump to
Current section
Files
lib/swoosh/email/recipient.ex
defprotocol Swoosh.Email.Recipient do
@moduledoc """
Recipient Protocol controls how data is formatted into an email recipient
## Deriving
The protocol allows leveraging the Elixir's `@derive` feature to simplify protocol implementation
in trivial cases. Accepted options are:
* `:name` (optional)
* `:address` (required)
## Example
defmodule MyUser do
@derive {Swoosh.Email.Recipient, name: :name, address: :email}
defstruct [:name, :email, :other_props]
end
or with optional name...
defmodule MySubscriber do
@derive {Swoosh.Email.Recipient, address: :email}
defstruct [:email, :preferences]
end
full implementation without deriving...
defmodule MyUser do
defstruct [:name, :email, :other_props]
end
defimpl Swoosh.Email.Recipient, for: MyUser do
def format(%MyUser{name: name, email: address} = value) do
{name, address}
end
end
"""
@type t :: term
@fallback_to_any true
@doc """
Formats `value` into a Swoosh recipient, a 2-tuple with recipient name and recipient address
"""
@spec format(t) :: Swoosh.Email.mailbox()
def format(value)
end
defimpl Swoosh.Email.Recipient, for: Any do
defmacro __deriving__(module, struct, opts) do
name_field = Keyword.get(opts, :name)
address_field = Keyword.fetch!(opts, :address)
keys = Map.keys(struct)
fields =
[{:name, name_field}, {:address, address_field}]
|> Enum.reject(fn {_, field} -> is_nil(field) end)
|> Enum.map(fn {var, field} ->
unless field in keys do
raise ArgumentError, "#{inspect(field)} does not exist in #{inspect(struct)}"
end
{field, {var, [generated: true], __MODULE__}}
end)
quote do
defimpl Swoosh.Email.Recipient, for: unquote(module) do
def format(%{unquote_splicing(fields)}) do
{unquote(if(name_field, do: Macro.var(:name, __MODULE__), else: "")), address}
end
end
end
end
def format(data) do
raise Protocol.UndefinedError,
protocol: @protocol,
value: data,
description: """
Swoosh.Email.Recipient needs to be implemented for #{inspect(data)}
Default implementations of Recipient include
* a string representing an email address like `foo.bar@example.com`
* or a two-element tuple `{name, address}`, where name and address are strings.
- name is allowed to be nil in this case
"""
end
end
defimpl Swoosh.Email.Recipient, for: Tuple do
def format({name, address}) when name in [nil, ""] and is_binary(address) and address != "" do
{"", address}
end
def format({name, address}) when is_binary(name) and is_binary(address) and address != "" do
{name, address}
end
def format(tuple) do
raise ArgumentError, """
Unexpected tuple format, #{inspect(tuple)} cannot be formatted into a Recipeint.
The expected format is {name :: String.t() | nil, address :: String.t()}, where address cannot be empty.
"""
end
end
defimpl Swoosh.Email.Recipient, for: BitString do
def format("") do
raise ArgumentError, """
Cannot format empty string into a Recipeint.
"""
end
def format(address) when is_binary(address) do
{"", address}
end
end