Skip to content

Commit 43d0f8a

Browse files
Alex Wieserandrewtimberlake
Alex Wieser
authored andcommitted
Wrap header values in quotes if they contain characters that are not allowed
1 parent 1610034 commit 43d0f8a

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

lib/mail/renderers/rfc_2822.ex

+9
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ defmodule Mail.Renderers.RFC2822 do
140140

141141
defp render_address({name, email}), do: "#{encode_header_value(~s("#{name}"), :quoted_printable)} <#{validate_address(email)}>"
142142
defp render_address(email), do: validate_address(email)
143+
143144
defp render_subtypes([]), do: []
144145

145146
defp render_subtypes([{key, value} | subtypes]) when is_atom(key),
@@ -152,6 +153,14 @@ defmodule Mail.Renderers.RFC2822 do
152153
defp render_subtypes([{key, value} | subtypes]) do
153154
key = String.replace(key, "_", "-")
154155
value = encode_header_value(value, :quoted_printable)
156+
157+
value =
158+
if value =~ ~r/[\s;]/ do
159+
"\"#{value}\""
160+
else
161+
value
162+
end
163+
155164
["#{key}=#{value}" | render_subtypes(subtypes)]
156165
end
157166

test/mail/renderers/rfc_2822_test.exs

+11
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,17 @@ defmodule Mail.Renderers.RFC2822Test do
1515
assert header == "Foo-Bar: abcd; baz-buzz=qux"
1616
end
1717

18+
test "quotes header parameters if necessary" do
19+
header = Mail.Renderers.RFC2822.render_header("Content-Disposition", ["attachment", filename: "my-test-file"])
20+
assert header == "Content-Disposition: attachment; filename=my-test-file"
21+
22+
header = Mail.Renderers.RFC2822.render_header("Content-Disposition", ["attachment", filename: "my test file"])
23+
assert header == "Content-Disposition: attachment; filename=\"my test file\""
24+
25+
header = Mail.Renderers.RFC2822.render_header("Content-Disposition", ["attachment", filename: "my;test;file"])
26+
assert header == "Content-Disposition: attachment; filename=\"my;test;file\""
27+
end
28+
1829
test "address headers renders list of recipients" do
1930
header = Mail.Renderers.RFC2822.render_header("from", "[email protected]")
2031
assert header == "From: [email protected]"

0 commit comments

Comments
 (0)