Packages
swoosh
1.16.7
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/attachment.ex
defmodule Swoosh.Attachment do
@moduledoc ~S"""
Struct representing an attachment in an email.
## Usage
For all usecases of `new/2` see the function documentation.
## Inline Example
new()
|> to({avenger.name, avenger.email})
|> from({"Red Skull", "red_skull@villains.org"})
|> subject("End Game invitation QR Code")
|> html_body(~s|<h1>Hello #{avenger.name}</h1> Here is your QR Code <img src="cid:qrcode.png">|)
|> text_body("Hello #{avenger.name}. Please find your QR Code attached.\n")
|> attachment(
Swoosh.Attachment.new(
{:data, invitation_qr_code_binary},
filename: "qrcode.png",
content_type: "image/png",
type: :inline)
)
|> VillainMailer.deliver()
"""
defstruct filename: nil,
content_type: nil,
path: nil,
data: nil,
type: :attachment,
cid: nil,
headers: []
@type t :: %__MODULE__{
filename: String.t(),
content_type: String.t(),
path: String.t() | nil,
data: binary | nil,
type: :inline | :attachment,
cid: String.t() | nil,
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
Attachment.new({:data, File.read!("/path/to/attachment.png")}, filename: "image.png", content_type: "image/png")
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)
Inline attachments by default use their filename
(or basename of the path if filename is not specified) as cid,
in relevant adapters.
Attachment.new("/data/file.png", type: :inline)
Gives you something like this:
<img src="cid:file.png">
You can optionally override this default by passing in the cid option:
Attachment.new("/data/file.png", type: :inline, cid: "custom-cid")
"""
@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)
filename = attachment.filename || Path.basename(path)
cid = if attachment.type == :inline, do: attachment.cid || filename, else: nil
%{
attachment
| path: path,
filename: filename,
content_type: attachment.content_type || MIME.from_path(path),
cid: cid
}
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