]> granicus.if.org Git - python/commitdiff
#14380: Have MIMEText defaults to utf-8 when passed non-ASCII unicode
authorR David Murray <rdmurray@bitdance.com>
Fri, 23 Mar 2012 02:17:51 +0000 (22:17 -0400)
committerR David Murray <rdmurray@bitdance.com>
Fri, 23 Mar 2012 02:17:51 +0000 (22:17 -0400)
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.

Doc/library/email.mime.rst
Lib/email/mime/text.py
Lib/test/test_email/test_email.py
Misc/ACKS
Misc/NEWS

index 9cd94d8926f9d2d861deb891600ac11c8c25574c..f3f34c8dd17a10e60e44ccc81e4239d11ae23423 100644 (file)
@@ -175,7 +175,7 @@ Here are the classes:
 
 .. currentmodule:: email.mime.text
 
-.. class:: MIMEText(_text, _subtype='plain', _charset='us-ascii')
+.. class:: MIMEText(_text, _subtype='plain', _charset=None)
 
    Module: :mod:`email.mime.text`
 
@@ -185,5 +185,5 @@ Here are the classes:
    minor type and defaults to :mimetype:`plain`.  *_charset* is the character
    set of the text and is passed as a parameter to the
    :class:`~email.mime.nonmultipart.MIMENonMultipart` constructor; it defaults
-   to ``us-ascii``.  No guessing or encoding is performed on the text data.
-
+   to ``us-ascii`` if the string contains only ``ascii`` codepoints, and
+   ``utf-8`` otherwise.
index 5747db5d670c8082999cc6f089dcc416db07ddba..5a5e39bb3891f3823f4501c6ddbfb7a334bae34f 100644 (file)
@@ -27,4 +27,14 @@ class MIMEText(MIMENonMultipart):
         """
         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)
index e771c20303107a836c55a98e617d9c6fedf67623..86aa60c13444964704e26ca2992743bdcfd9a84e 100644 (file)
@@ -617,6 +617,19 @@ class TestMessageAPI(TestEmailBase):
             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 @@ class TestEncoders(unittest.TestCase):
         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')
index 9ed148e5f22c6e24297b3f14cfcda3fbb540bd9c..4e6597dea1a16c6c33d5cab828425cb83962cecf 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -548,6 +548,7 @@ Thomas Kluyver
 Kim Knapp
 Lenny Kneler
 Pat Knight
+Jeff Knupp
 Greg Kochanski
 Damon Kohler
 Marko Kohtala
index 02bafcd59e6c05cdf2adb427b156816af5389c9c..b6d7dadfcefc546e972361c8e8a58bc15624e275 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -34,6 +34,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #14380: MIMEText now defaults to utf-8 when passed non-ASCII unicode
+  with no charset specified.
+
 - Issue #10340: asyncore - properly handle EINVAL in dispatcher constructor on
   OSX; avoid to call handle_connect in case of a disconnected socket which
   was not meant to connect.