email: Fix _flatten() implementation for non-ASCII bodies
authorW. Trevor King <wking@tremily.us>
Thu, 24 Jan 2013 04:41:50 +0000 (23:41 -0500)
committerW. Trevor King <wking@tremily.us>
Thu, 24 Jan 2013 04:49:49 +0000 (23:49 -0500)
The email header should be flattened to ASCII with funky encoded
headers [1], but the body may be encoded in a non-ASCII-compatible
charset (e.g. UTF-16-LE).  The old _flatten() implementation used the
body charset to encode the entire message, which could garble the
header.  This patch uses BytesGenerator, which takes advantage of
email.charset.Charset's separate fields for the header encoding and
body encoding.

[1]: http://docs.python.org/3/library/email.header.html

Signed-off-by: W. Trevor King <wking@tremily.us>
rss2email/email.py

index 4fac7993c4f483663d5ddf931344e60845bfb9d6..8bf3eb61950d152ad4acd22b17ad767d93db7d9e 100644 (file)
 
 from email.charset import Charset as _Charset
 import email.encoders as _email_encoders
+from email.generator import BytesGenerator as _BytesGenerator
 from email.header import Header as _Header
 from email.mime.text import MIMEText as _MIMEText
 from email.utils import formataddr as _formataddr
 from email.utils import parseaddr as _parseaddr
+import io as _io
 import smtplib as _smtplib
 import subprocess as _subprocess
 
@@ -226,7 +228,10 @@ def _flatten(message):
     b''
     b"\x00Y\x00o\x00u\x00'\x00r\x00e\x00 \x00g\x00r\x00e\x00a\x00t\x00,\x00 \x00\x96\x03\xb5\x03\xcd\x03\xc2\x03!\x00\\\x00n\x00"
     """
-    return message.as_string().encode(str(message.get_charset()))
+    bytesio = _io.BytesIO()
+    generator = _BytesGenerator(bytesio)  # use policies for Python >=3.3
+    generator.flatten(message)
+    return bytesio.getvalue()
 
 def sendmail_send(sender, recipient, message, config=None, section='DEFAULT'):
     if config is None: