diff -r 3877bf2e3235 Lib/email/header.py --- a/Lib/email/header.py Mon Mar 12 09:46:44 2012 -0700 +++ b/Lib/email/header.py Tue Mar 13 17:46:46 2012 -0700 @@ -283,7 +283,12 @@ # character set, otherwise an early error is thrown. output_charset = charset.output_codec or 'us-ascii' if output_charset != _charset.UNKNOWN8BIT: - s.encode(output_charset, errors) + try: + s.encode(output_charset, errors) + except UnicodeEncodeError: + if output_charset!='us-ascii': + raise + charset = UTF8 self._chunks.append((s, charset)) def encode(self, splitchars=';, \t', maxlinelen=None, linesep='\n'): diff -r 3877bf2e3235 Lib/test/test_email/test_email.py --- a/Lib/test/test_email/test_email.py Mon Mar 12 09:46:44 2012 -0700 +++ b/Lib/test/test_email/test_email.py Tue Mar 13 17:46:46 2012 -0700 @@ -604,6 +604,19 @@ msg['Dummy'] = 'dummy\nX-Injected-Header: test' self.assertRaises(errors.HeaderParseError, msg.as_string) + def test_unicode_header_defaults_to_utf8_encoding(self): + # Issue 14291 + m = MIMEText('abc\n') + m['Subject'] = u'É test' + self.assertEqual(str(m),"""\ +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: =?utf-8?q?=C3=89_test?= + +abc +""") + # Test the email.encoders module class TestEncoders(unittest.TestCase):