Packages
swoosh
1.7.0
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/adapters/local/storage/memory.ex
defmodule Swoosh.Adapters.Local.Storage.Memory do
@moduledoc ~S"""
In-memory storage driver used by the
[Swoosh.Adapters.Local](Swoosh.Adapters.Local.html) module.
The emails in this mailbox are stored in memory and won't persist once your
application is stopped.
"""
use GenServer
@doc """
Starts the server
"""
def start_link(args \\ []) do
case GenServer.start_link(__MODULE__, args, name: {:global, __MODULE__}) do
{:ok, pid} ->
{:ok, pid}
{:error, {:already_started, pid}} ->
Process.link(pid)
{:ok, pid}
end
end
@doc """
Stops the server
"""
def stop() do
GenServer.stop({:global, __MODULE__})
end
@doc ~S"""
Push a new email into the mailbox.
In order to make it easy to fetch a single email, a `Message-ID` header is
added to the email before being stored.
## Examples
iex> email = new |> from("tony.stark@example.com")
%Swoosh.Email{from: {"", "tony.stark@example.com"}, [...]}
iex> Memory.push(email)
%Swoosh.Email{from: {"", "tony.stark@example.com"}, headers: %{"Message-ID": "a1b2c3"}, [...]}
"""
def push(email) do
GenServer.call({:global, __MODULE__}, {:push, email})
end
@doc ~S"""
Pop the last email from the mailbox.
## Examples
iex> email = new |> from("tony.stark@example.com")
%Swoosh.Email{from: {"", "tony.stark@example.com"}, [...]}
iex> Memory.push(email)
%Swoosh.Email{from: {"", "tony.stark@example.com"}, headers: %{"Message-ID": "a1b2c3"}, [...]}
iex> Memory.all() |> Enum.count()
1
iex> Memory.pop()
%Swoosh.Email{from: {"", "tony.stark@example.com"}, headers: %{"Message-ID": "a1b2c3"}, [...]}
iex> Memory.all() |> Enun.count()
0
"""
def pop() do
GenServer.call({:global, __MODULE__}, :pop)
end
@doc ~S"""
Get a specific email from the mailbox.
## Examples
iex> email = new |> from("tony.stark@example.com")
%Swoosh.Email{from: {"", "tony.stark@example.com"}, [...]}
iex> Memory.push(email)
%Swoosh.Email{from: {"", "tony.stark@example.com"}, headers: %{"Message-ID": "a1b2c3"}, [...]}
iex> Memory.get("A1B2C3")
%Swoosh.Email{from: {"", "tony.stark@example.com"}, headers: %{"Message-ID": "a1b2c3"}, [...]}
"""
def get(id) do
GenServer.call({:global, __MODULE__}, {:get, id})
end
@doc ~S"""
List all the emails in the mailbox.
## Examples
iex> email = new |> from("tony.stark@example.com")
%Swoosh.Email{from: {"", "tony.stark@example.com"}, [...]}
iex> Memory.push(email)
%Swoosh.Email{from: {"", "tony.stark@example.com"}, headers: %{"Message-ID": "a1b2c3"}, [...]}
iex> Memory.all()
[%Swoosh.Email{from: {"", "tony.stark@example.com"}, headers: %{"Message-ID": "a1b2c3"}, [...]}]
"""
def all() do
GenServer.call({:global, __MODULE__}, :all)
end
@doc ~S"""
Delete all the emails currently in the mailbox.
## Examples
iex> email = new |> from("tony.stark@example.com")
%Swoosh.Email{from: {"", "tony.stark@example.com"}, [...]}
iex> Memory.push(email)
%Swoosh.Email{from: {"", "tony.stark@example.com"}, headers: %{"Message-ID": "a1b2c3"}, [...]}
iex> Memory.delete_all()
:ok
iex> Memory.list()
[]
"""
def delete_all() do
GenServer.call({:global, __MODULE__}, :delete_all)
end
# Callbacks
def init(_args) do
{:ok, []}
end
def handle_call({:push, email}, _from, emails) do
id = :crypto.strong_rand_bytes(16) |> Base.encode16() |> String.downcase()
email =
email
|> Swoosh.Email.header("Message-ID", id)
|> Swoosh.Email.put_private(:sent_at, DateTime.utc_now() |> DateTime.to_iso8601())
attachments_with_data =
Enum.map(email.attachments, fn attachment ->
%{attachment | data: Swoosh.Attachment.get_content(attachment)}
end)
email = %{email | attachments: attachments_with_data}
{:reply, email, [email | emails]}
end
def handle_call(:pop, _from, [h | t]) do
{:reply, h, t}
end
def handle_call({:get, id}, _from, emails) do
email =
Enum.find(emails, fn %{headers: %{"Message-ID" => msg_id}} ->
msg_id == String.downcase(id)
end)
{:reply, email, emails}
end
def handle_call(:all, _from, emails) do
{:reply, emails, emails}
end
def handle_call(:delete_all, _from, _emails) do
{:reply, :ok, []}
end
end