Compare commits
No commits in common. "master" and "master" have entirely different histories.
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,4 +1,3 @@
|
||||
.DS_Store
|
||||
/_build
|
||||
/cover
|
||||
/deps
|
||||
|
@ -29,4 +29,4 @@ defmodule Mailex do
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
@ -1,38 +1,37 @@
|
||||
defmodule Mailex.Address do
|
||||
defstruct name: nil, address: nil
|
||||
|
||||
|
||||
def rfc_822_format(emails) when is_list(emails), do:
|
||||
Enum.map(emails, &rfc_822_format(&1))
|
||||
emails |> Enum.map(&rfc_822_format(&1))
|
||||
|
||||
|
||||
def rfc_822_format(email) when is_map(email) do
|
||||
email_address = Map.get(email, "address", Map.get(email, :address))
|
||||
email_name = email
|
||||
|> Map.get("name", Map.get(email, :name))
|
||||
|> prepare_name(email_address)
|
||||
"#{email_name} <#{email_address}>"
|
||||
email_name = Map.get(email, "name", Map.get(email, :name))
|
||||
|
||||
if email_name do
|
||||
"#{email_name} <#{email_address}>"
|
||||
else
|
||||
name = email_address |>
|
||||
String.split("@") |>
|
||||
List.first |>
|
||||
String.split(~r/([^\w\s]|_)/) |>
|
||||
Enum.map(&String.capitalize/1) |>
|
||||
Enum.join(" ")
|
||||
"#{name} <#{email_address}>"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def envelope_format(emails) when is_list(emails), do:
|
||||
Enum.map(emails, &envelope_format(&1))
|
||||
emails |> Enum.map(&envelope_format(&1))
|
||||
|
||||
def envelope_format(email) when is_map(email), do:
|
||||
"<#{Map.get(email, "address", Map.get(email, :address))}>"
|
||||
|
||||
defp prepare_name(email_name, address) do
|
||||
email_name = case email_name do
|
||||
nil -> address
|
||||
|> String.split("@")
|
||||
|> List.first
|
||||
|> String.split(~r/([^\w\s]|_)/)
|
||||
|> Enum.map(&String.capitalize/1)
|
||||
|> Enum.join(" ")
|
||||
_ -> String.strip(email_name)
|
||||
end
|
||||
if String.match?(email_name, ~r/[\(\)\<\>\@\,\;\:\"\.\[\]\\]/) do
|
||||
"\"\\\"" <> String.replace(email_name, "\"", "\\\"") <> "\\\"\""
|
||||
else
|
||||
email_name
|
||||
end
|
||||
def envelope_format(email) when is_map(email) do
|
||||
email_address = Map.get(email, "address", Map.get(email, :address))
|
||||
"<#{email_address}>"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
@ -3,14 +3,15 @@ defmodule Mailex.Render do
|
||||
alias Mailex.Address
|
||||
|
||||
def render(email) do
|
||||
mimemail_args = if email.text, do:
|
||||
[ { :plain, email.text } ], else: []
|
||||
mimemail_args = if email.html, do:
|
||||
[ { :html, email.html } | mimemail_args], else: mimemail_args
|
||||
mimemail_args = if email.attachments, do:
|
||||
[ Enum.map(email.attachments, fn(a) -> { :attachment, a.data, a } end) | mimemail_args ], else: mimemail_args
|
||||
mimemail_args = []
|
||||
if email.text, do:
|
||||
mimemail_args = [ { :plain, email.text } | mimemail_args]
|
||||
if email.html, do:
|
||||
mimemail_args = [ { :html, email.html } | mimemail_args]
|
||||
if email.attachments, do:
|
||||
mimemail_args = [ Enum.map(email.attachments, fn(a) -> { :attachment, a.data, a } end) | mimemail_args ]
|
||||
|
||||
List.flatten(mimemail_args) |> to_tuple(email) |> :mimemail.encode
|
||||
mimemail_args |> List.flatten |> to_tuple(email) |> :mimemail.encode
|
||||
end
|
||||
|
||||
|
||||
@ -106,16 +107,24 @@ defmodule Mailex.Render do
|
||||
|
||||
|
||||
def headers_for(email) do
|
||||
headers = if email.reply_to && (length(email.reply_to) > 0), do:
|
||||
[ { "Reply-To", email.reply_to |> stringify_addresses } ], else: []
|
||||
headers = []
|
||||
|
||||
if email.reply_to && (length(email.reply_to) > 0), do:
|
||||
headers = [ { "Reply-To", email.reply_to |> stringify_addresses } ]
|
||||
|
||||
# BCC should not go into headers
|
||||
headers = if email.cc && (length(email.cc) > 0), do:
|
||||
[ { "Cc", email.cc |> stringify_addresses } | headers ], else: headers
|
||||
headers = if email.to && (length(email.to) > 0), do:
|
||||
[ { "To", email.to |> stringify_addresses } | headers ], else: headers
|
||||
headers = if email.headers && (length(email.headers) > 0), do:
|
||||
headers ++ email.headers, else: headers
|
||||
[ { "From", email.from |> stringify_addresses }, { "Subject", email.subject || "" } | headers ]
|
||||
|
||||
if email.cc && (length(email.cc) > 0), do:
|
||||
headers = [ { "Cc", email.cc |> stringify_addresses } | headers ]
|
||||
|
||||
if email.to && (length(email.to) > 0), do:
|
||||
headers = [ { "To", email.to |> stringify_addresses } | headers ]
|
||||
|
||||
if email.headers && (length(email.headers) > 0), do:
|
||||
headers = headers ++ email.headers
|
||||
|
||||
[ { "From", email.from |> stringify_addresses },
|
||||
{ "Subject", email.subject || "" } | headers ]
|
||||
end
|
||||
|
||||
|
||||
@ -132,4 +141,4 @@ defmodule Mailex.Render do
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
2
mix.lock
2
mix.lock
@ -1,2 +1,2 @@
|
||||
%{"eiconv": {:git, "https://github.com/zotonic/eiconv.git", "644fb5e7bd6640fbd073f4d28957914ea979aea0", []},
|
||||
"gen_smtp": {:hex, :gen_smtp, "0.11.0", "d90ff2f021fc86cb2a4259b1f2b177ab6e506676265e26454bf5755855adc956", [:rebar3], []}}
|
||||
"gen_smtp": {:hex, :gen_smtp, "0.9.0"}}
|
||||
|
BIN
test/.DS_Store
vendored
Normal file
BIN
test/.DS_Store
vendored
Normal file
Binary file not shown.
@ -38,19 +38,11 @@ defmodule MailexTest do
|
||||
}
|
||||
end
|
||||
|
||||
defp email_with_special_chars_in_names do
|
||||
%Mailex.Email{
|
||||
from: %Mailex.Address{ name: ", Test", address: "test_a@gmail.com" },
|
||||
to: [%Mailex.Address{ name: ":,<>[]()'\"Whatever", address: "test_b@gmail.com" }]
|
||||
}
|
||||
end
|
||||
|
||||
test "Messages render" do
|
||||
assert email_minimal |> Mailex.Render.render
|
||||
assert email_with_reply_to |> Mailex.Render.render
|
||||
assert email_without_attachments |> Mailex.Render.render
|
||||
assert email_with_attachments |> Mailex.Render.render
|
||||
assert email_with_special_chars_in_names |> Mailex.Render.render
|
||||
end
|
||||
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user