diff --git a/lib/mimemail.ex b/lib/mimemail.ex index d7a20bd..6a846f6 100644 --- a/lib/mimemail.ex +++ b/lib/mimemail.ex @@ -50,7 +50,7 @@ defmodule MimeMail do end body = case headers[:'content-type'] do {"multipart/"<>_,%{boundary: bound}}-> - body |> String.split(~r"\s*--#{bound}\s*") |> Enum.slice(1..-2) |> Enum.map(&from_string/1) |> Enum.map(&decode_body/1) + body |> String.split(~r"\s*--#{Regex.escape(bound)}\s*") |> Enum.slice(1..-2) |> Enum.map(&from_string/1) |> Enum.map(&decode_body/1) {"text/"<>_,%{charset: charset}} -> body |> Iconv.conv(charset,"utf8") |> ok_or(ensure_ascii(body)) |> ensure_utf8 _ -> body diff --git a/lib/mimemail_headers.ex b/lib/mimemail_headers.ex index 3ea7608..496ebf4 100644 --- a/lib/mimemail_headers.ex +++ b/lib/mimemail_headers.ex @@ -20,7 +20,7 @@ defmodule MimeMail.Emails do data |> String.strip |> String.split(~r/\s*,\s*/) |> Enum.map(&MimeMail.Address.decode/1) end def decode_headers(%MimeMail{headers: headers}=mail) do - parsed=for {k,{:raw,v}}<-headers, k in [:from,:to,:cc,:cci,:'delivered-to'] do + parsed=for {k,{:raw,v}}<-headers, k in [:sender,:from,:to,:cc,:cci,:'reply-to',:'delivered-to'] do {k,v|>MimeMail.header_value|>parse_header} end %{mail| headers: Enum.reduce(parsed,headers, fn {k,v},acc-> Dict.put(acc,k,v) end)} @@ -110,10 +110,10 @@ defmodule MimeMail.Words do def single_word_decode("=?"<>rest = str) do case String.split(rest,"?") do - [enc,"Q",enc_str,"="] -> + [enc,enc_type,enc_str,"="] when enc_type in ~w(q Q) -> str = q_to_binary(enc_str,[]) MimeMail.ok_or(Iconv.conv(str,enc,"utf8"),MimeMail.ensure_ascii(str)) - [enc,"B",enc_str,"="] -> + [enc,enc_type,enc_str,"="] when enc_type in ~w(b B)-> str = Base.decode64(enc_str) |> MimeMail.ok_or(enc_str) MimeMail.ok_or(Iconv.conv(str,enc,"utf8"),MimeMail.ensure_ascii(str)) _ -> "#{str} " diff --git a/mix.exs b/mix.exs index e00ed0e..9998384 100644 --- a/mix.exs +++ b/mix.exs @@ -1,4 +1,6 @@ defmodule Mix.Tasks.Compile.Iconv do + use Mix.Task + @shortdoc "Compiles Iconv" @doc """ For Linux: @@ -36,10 +38,10 @@ defmodule Mailibex.Mixfile do [app: :mailibex, version: "0.1.2", elixir: "> 1.0.0", - description: description, - package: package, + description: description(), + package: package(), compilers: [:iconv, :elixir, :app], - deps: deps] + deps: deps()] end def application do diff --git a/test/mime_headers_test.exs b/test/mime_headers_test.exs index 18cc106..f6a5085 100644 --- a/test/mime_headers_test.exs +++ b/test/mime_headers_test.exs @@ -42,11 +42,15 @@ defmodule MimeHeadersTest do test "decode str from base 64 encoded-word" do assert "Jérôme Nicolle" = MimeMail.Words.word_decode("=?UTF-8?B?SsOpcsO0bWUgTmljb2xsZQ==?=") + assert "Jérôme Nicolle" + = MimeMail.Words.word_decode("=?utf-8?b?SsOpcsO0bWUgTmljb2xsZQ==?=") end test "decode str from q-encoded-word" do assert "[FRnOG] [TECH] ToS implémentée chez certains transitaires" = MimeMail.Words.word_decode("[FRnOG] =?UTF-8?Q?=5BTECH=5D_ToS_impl=C3=A9ment=C3=A9e_chez_certa?=\r\n =?UTF-8?Q?ins_transitaires?=") + assert "[FRnOG] [TECH] ToS implémentée chez certains transitaires" + = MimeMail.Words.word_decode("[FRnOG] =?utf-8?q?=5BTECH=5D_ToS_impl=C3=A9ment=C3=A9e_chez_certa?=\r\n =?utf-8?q?ins_transitaires?=") end test "encode str into multiple encoded-word, test line length and round trip" do