Packages
swoosh
0.25.6
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/attachment.ex
defmodule Swoosh.Attachment do
@moduledoc """
Struct representing an attachment in an email.
"""
defstruct filename: nil, content_type: nil, path: nil, data: nil, type: :attachment, headers: []
@type t :: %__MODULE__{
filename: String.t(),
content_type: String.t(),
path: String.t() | nil,
data: binary | nil,
type: :inline | :attachment,
headers: [{String.t(), String.t()}]
}
@doc ~S"""
Creates a new Attachment
Examples:
Attachment.new("/path/to/attachment.png")
Attachment.new("/path/to/attachment.png", filename: "image.png")
Attachment.new("/path/to/attachment.png", filename: "image.png", content_type: "image/png")
Attachment.new(params["file"]) # Where params["file"] is a %Plug.Upload
Examples with inline-attachments:
Attachment.new("/path/to/attachment.png", type: :inline)
Attachment.new("/path/to/attachment.png", filename: "image.png", type: :inline)
Attachment.new("/path/to/attachment.png", filename: "image.png", content_type: "image/png", type: :inline)
Attachment.new(params["file"], type: "inline") # Where params["file"] is a %Plug.Upload
Attachment.new({:data, File.read!("/path/to/attachment.png")}, filename: "image.png", content_type: "image/png", type: :inline)
"""
@spec new(binary | struct | {:data, binary}, Keyword.t() | map) :: %__MODULE__{}
def new(path, opts \\ [])
if Code.ensure_loaded?(Plug) do
def new(
%Plug.Upload{
filename: filename,
content_type: content_type,
path: path
},
opts
) do
new(
path,
Keyword.merge(
[filename: filename, content_type: content_type],
opts
)
)
end
end
def new({:data, data}, opts) do
%{struct!(__MODULE__, opts) | data: data}
end
def new(path, opts) do
attachment = struct!(__MODULE__, opts)
%{
attachment
| path: path,
filename: attachment.filename || Path.basename(path),
content_type: attachment.content_type || MIME.from_path(path)
}
end
@type content_encoding :: :raw | :base64
@spec get_content(%__MODULE__{}, content_encoding) :: binary | no_return
def get_content(%__MODULE__{data: nil, path: nil}) do
raise Swoosh.AttachmentContentError, message: "No path or data is provided"
end
def get_content(%__MODULE__{data: data, path: path}, encoding \\ :raw) do
encode(data || File.read!(path), encoding)
end
defp encode(content, :raw), do: content
defp encode(content, :base64), do: Base.encode64(content)
end