mirror of
https://github.com/discourse/discourse.git
synced 2025-05-30 15:28:37 +08:00
Fix reply-by-mail for 8-bit transfer encodings
The mail class seems to handle mails sent with Content-Transfer-Encoding: 8bit somewhat weirdly: It decodes them (to utf-8), changes the raw source to base64, and does not modify the Content-Type:charset= header. This leads to Discourse trying the message encoding (in my example ISO-8859-1) first, and if that does not contain any unparseable characters, it uses that. Sadly, in ISO-8859-1, every byte sequence is valid. Fix this by always trying to decode as UTF-8 first. The probability of someone using another encoding that cleanly (but wrongly) decodes as UTF-8 should be fairly low.
This commit is contained in:
@ -217,6 +217,13 @@ module Email
|
||||
encodings = ["UTF-8", "ISO-8859-1"]
|
||||
encodings.unshift(mail_part.charset) if mail_part.charset.present?
|
||||
|
||||
# mail (>=2.5) decodes mails with 8bit transfer encoding to utf-8, so
|
||||
# always try UTF-8 first
|
||||
if mail_part.content_transfer_encoding == "8bit"
|
||||
encodings.delete("UTF-8")
|
||||
encodings.unshift("UTF-8")
|
||||
end
|
||||
|
||||
encodings.uniq.each do |encoding|
|
||||
fixed = try_to_encode(string, encoding)
|
||||
return fixed if fixed.present?
|
||||
|
Reference in New Issue
Block a user