1
0
forked from migadu/mailex

Compare commits

..

3 Commits

Author SHA1 Message Date
da1e914af0 updated for elixir 1.3 2016-07-29 15:13:00 +02:00
98613e1a6f updated for elixir 1.3 2016-07-29 15:12:39 +02:00
ee242ca92a handle special characters in names 2016-05-05 22:32:03 +02:00
8 changed files with 54 additions and 53 deletions

BIN
.DS_Store vendored

Binary file not shown.

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
.DS_Store
/_build /_build
/cover /cover
/deps /deps

View File

@ -29,4 +29,4 @@ defmodule Mailex do
end end
end end
end end

View File

@ -1,37 +1,38 @@
defmodule Mailex.Address do defmodule Mailex.Address do
defstruct name: nil, address: nil defstruct name: nil, address: nil
def rfc_822_format(emails) when is_list(emails), do: def rfc_822_format(emails) when is_list(emails), do:
emails |> Enum.map(&rfc_822_format(&1)) Enum.map(emails, &rfc_822_format(&1))
def rfc_822_format(email) when is_map(email) do def rfc_822_format(email) when is_map(email) do
email_address = Map.get(email, "address", Map.get(email, :address)) email_address = Map.get(email, "address", Map.get(email, :address))
email_name = Map.get(email, "name", Map.get(email, :name)) email_name = email
|> Map.get("name", Map.get(email, :name))
|> prepare_name(email_address)
"#{email_name} <#{email_address}>"
end
if email_name do def envelope_format(emails) when is_list(emails), do:
"#{email_name} <#{email_address}>" Enum.map(emails, &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 else
name = email_address |> email_name
String.split("@") |>
List.first |>
String.split(~r/([^\w\s]|_)/) |>
Enum.map(&String.capitalize/1) |>
Enum.join(" ")
"#{name} <#{email_address}>"
end end
end end
end
def envelope_format(emails) when is_list(emails), do:
emails |> Enum.map(&envelope_format(&1))
def envelope_format(email) when is_map(email) do
email_address = Map.get(email, "address", Map.get(email, :address))
"<#{email_address}>"
end
end

View File

@ -3,15 +3,14 @@ defmodule Mailex.Render do
alias Mailex.Address alias Mailex.Address
def render(email) do def render(email) do
mimemail_args = [] mimemail_args = if email.text, do:
if email.text, do: [ { :plain, email.text } ], else: []
mimemail_args = [ { :plain, email.text } | mimemail_args] mimemail_args = if email.html, do:
if email.html, do: [ { :html, email.html } | mimemail_args], else: mimemail_args
mimemail_args = [ { :html, email.html } | mimemail_args] mimemail_args = if email.attachments, do:
if email.attachments, do: [ Enum.map(email.attachments, fn(a) -> { :attachment, a.data, a } end) | mimemail_args ], else: mimemail_args
mimemail_args = [ Enum.map(email.attachments, fn(a) -> { :attachment, a.data, a } end) | mimemail_args ]
mimemail_args |> List.flatten |> to_tuple(email) |> :mimemail.encode List.flatten(mimemail_args) |> to_tuple(email) |> :mimemail.encode
end end
@ -107,24 +106,16 @@ defmodule Mailex.Render do
def headers_for(email) do def headers_for(email) do
headers = [] headers = if email.reply_to && (length(email.reply_to) > 0), do:
[ { "Reply-To", email.reply_to |> stringify_addresses } ], else: []
if email.reply_to && (length(email.reply_to) > 0), do:
headers = [ { "Reply-To", email.reply_to |> stringify_addresses } ]
# BCC should not go into headers # BCC should not go into headers
headers = if email.cc && (length(email.cc) > 0), do:
if email.cc && (length(email.cc) > 0), do: [ { "Cc", email.cc |> stringify_addresses } | headers ], else: headers
headers = [ { "Cc", email.cc |> stringify_addresses } | headers ] headers = if email.to && (length(email.to) > 0), do:
[ { "To", email.to |> stringify_addresses } | headers ], else: headers
if email.to && (length(email.to) > 0), do: headers = if email.headers && (length(email.headers) > 0), do:
headers = [ { "To", email.to |> stringify_addresses } | headers ] headers ++ email.headers, else: headers
[ { "From", email.from |> stringify_addresses }, { "Subject", email.subject || "" } | headers ]
if email.headers && (length(email.headers) > 0), do:
headers = headers ++ email.headers
[ { "From", email.from |> stringify_addresses },
{ "Subject", email.subject || "" } | headers ]
end end
@ -141,4 +132,4 @@ defmodule Mailex.Render do
end end
end end

View File

@ -1,2 +1,2 @@
%{"eiconv": {:git, "https://github.com/zotonic/eiconv.git", "644fb5e7bd6640fbd073f4d28957914ea979aea0", []}, %{"eiconv": {:git, "https://github.com/zotonic/eiconv.git", "644fb5e7bd6640fbd073f4d28957914ea979aea0", []},
"gen_smtp": {:hex, :gen_smtp, "0.9.0"}} "gen_smtp": {:hex, :gen_smtp, "0.11.0", "d90ff2f021fc86cb2a4259b1f2b177ab6e506676265e26454bf5755855adc956", [:rebar3], []}}

BIN
test/.DS_Store vendored

Binary file not shown.

View File

@ -38,11 +38,19 @@ defmodule MailexTest do
} }
end 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 test "Messages render" do
assert email_minimal |> Mailex.Render.render assert email_minimal |> Mailex.Render.render
assert email_with_reply_to |> Mailex.Render.render assert email_with_reply_to |> Mailex.Render.render
assert email_without_attachments |> Mailex.Render.render assert email_without_attachments |> Mailex.Render.render
assert email_with_attachments |> Mailex.Render.render assert email_with_attachments |> Mailex.Render.render
assert email_with_special_chars_in_names |> Mailex.Render.render
end end
end end