Index: Lib/email/test/test_email.py =================================================================== --- Lib/email/test/test_email.py (révision 67201) +++ Lib/email/test/test_email.py (copie de travail) @@ -3387,6 +3387,25 @@ +# Test some badly formatted messages +class TestUnicode(TestEmailBase): + def test_header(self): + msg = MIMEText('accent \xe9\xf4\u0142', 'plain', 'utf-8') + msg['Subject'] = 'sujet \xe9\xf4\u0142' + msg['From'] = 'toto@localhost' + msg['To'] = 'toto@localhost' + self.assertEqual(msg.as_string(), """Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: base64 +Subject: =?utf-8?b?c3VqZXQgw6nDtMWC?= +From: toto@localhost +To: toto@localhost + +YWNjZW50IMOpw7TFgg== +""") + + + def _testclasses(): mod = sys.modules[__name__] return [getattr(mod, name) for name in dir(mod) if name.startswith('Test')] Index: Lib/email/generator.py =================================================================== --- Lib/email/generator.py (révision 67201) +++ Lib/email/generator.py (copie de travail) @@ -105,7 +105,7 @@ # handle that itself. If not, we'll do it generically. meth = getattr(msg, '_write_headers', None) if meth is None: - self._write_headers(msg) + self._write_headers(msg, msg._charset) else: meth(self) self._fp.write(sfp.getvalue()) @@ -130,14 +130,19 @@ # Default handlers # - def _write_headers(self, msg): + def _write_headers(self, msg, charset): for h, v in msg.items(): print('%s:' % h, end=' ', file=self._fp) if isinstance(v, Header): print(v.encode(maxlinelen=self._maxheaderlen), file=self._fp) else: # Header's got lots of smarts, so use it. - header = Header(v, maxlinelen=self._maxheaderlen, + try: + vascii = v.encode('ASCII') + header_charset = None + except UnicodeEncodeError: + header_charset = charset + header = Header(v, header_charset, maxlinelen=self._maxheaderlen, header_name=h, continuation_ws='\t') print(header.encode(), file=self._fp) # A blank line always separates headers from body