-
-
Notifications
You must be signed in to change notification settings - Fork 24
Description
When you specify a long filenames for an attachment, it encodes in such a way that violates a number of RFCs limits on maximum lengths. On strict mail servers that enforce these limits, the email can be rejected.
So for instance the code:
let filename = "long ".repeat(200) + ".png";
let eml = MessageBuilder::new()
.from(("John Doe", "[email protected]"))
.to("[email protected]")
.subject("Hello, world!")
.text_body("Message contents go here.")
.message_id("NotARealMessageID")
.attachment("image/png", filename, [1, 2, 3, 4].as_ref())
.write_to_string()
.unwrap();Produces this MIME header within the string:
Content-Disposition: attachment;
filename="=?us-ascii?Q?long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_.png?="The tab-prefixed filename= line is over the 998 character limit and the preferred 78 character limit in RFC 2822, the 75 character limit for encoded-words in RFC 2047 and the 78 character limit for Content-Disposition parameter values in RFC 2183
I would expect it to encode using RFC 2231 MIME continuations. If it's ASCII, I'd also expect it not to use encoded-words, so something like:
Content-Disposition: attachment;
filename*0="long long long long long long long long long long long lo";
filename*1="ng long long long long long long long long long long long";
filename*2=" long long long long long long long long long long long l";
filename*3="ong long long long long long long long long long long lon";
filename*4="g long long long long long long long long long long long ";
filename*5="long long long long long long long long long long long lo";
filename*6="ng long long long long long long long long long long long";
filename*7=" long long long long long long long long long long long l";
filename*8="ong long long long long long long long long long long lon";
filename*9="g long long long long long long long long long long long ";
filename*10="long long long long long long long long long long long l";
filename*11="ong long long long long long long long long long long lo";
filename*12="ng long long long long long long long long long long lon";
filename*13="g long long long long long long long long long long long";
filename*14=" long long long long long long long long long long long ";
filename*15="long long long long long long long long long long long l";
filename*16="ong long long long long long long long long long long lo";
filename*17="ng long long long long long long long .png"If there are characters that aren't allowed in MIME values, I'd expect it to wrap similarly using either the character encoding syntax from RFC 2231 or multiple encoded-words blocks. So for something like:
let filename = "this is a very long filename with characters that are not permitted in quoted strings like emojis 📧.zip";I'd expect output like:
Content-Disposition: attachment;
filename*0*=utf-8''this%20is%20a%20very%20long%20filename%20with%20character;
filename*1*=s%20that%20are%20not%20permitted%20in%20quoted%20strings%20like;
filename*2=%20emojis%20%F0%9F%93%A7.zip