#14380: Have MIMEText defaults to utf-8 when passed non-ASCII unicode

Previously it would just accept the unicode, which would wind up as unicode in
the transfer-encoded message object, which is just wrong.

Patch by Jeff Knupp.
diff --git a/Lib/email/mime/text.py b/Lib/email/mime/text.py
index 5747db5..5a5e39b 100644
--- a/Lib/email/mime/text.py
+++ b/Lib/email/mime/text.py
@@ -27,4 +27,14 @@
         """
         MIMENonMultipart.__init__(self, 'text', _subtype,
                                   **{'charset': _charset})
+
+        # If _charset was defualted, check to see see if there are non-ascii
+        # characters present. Default to utf-8 if there are.
+        # XXX: This can be removed once #7304 is fixed.
+        if _charset =='us-ascii':
+            try:
+                _text.encode(_charset)
+            except UnicodeEncodeError:
+                _charset = 'utf-8'
+
         self.set_payload(_text, _charset)
diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py
index e771c20..86aa60c 100644
--- a/Lib/test/test_email/test_email.py
+++ b/Lib/test/test_email/test_email.py
@@ -617,6 +617,19 @@
             abc
             """))
 
+    def test_unicode_body_defaults_to_utf8_encoding(self):
+        # Issue 14291
+        m = MIMEText('É testabc\n')
+        self.assertEqual(str(m),textwrap.dedent("""\
+            MIME-Version: 1.0
+            Content-Type: text/plain; charset="utf-8"
+            Content-Transfer-Encoding: base64
+
+            w4kgdGVzdGFiYwo=
+            """))
+
+
+
 # Test the email.encoders module
 class TestEncoders(unittest.TestCase):
 
@@ -642,7 +655,7 @@
         eq(msg['content-transfer-encoding'], '7bit')
         # Similar, but with 8bit data
         msg = MIMEText('hello \xf8 world')
-        eq(msg['content-transfer-encoding'], '8bit')
+        eq(msg['content-transfer-encoding'], 'base64')
         # And now with a different charset
         msg = MIMEText('hello \xf8 world', _charset='iso-8859-1')
         eq(msg['content-transfer-encoding'], 'quoted-printable')