This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author yegle
Recipients barry, r.david.murray, yegle
Date 2014-02-02.02:41:27
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <>
Currently the `msg` argument of `smtplib.SMTP.sendmail` accept a `str` in Py3k if every characters in this `str` is in ASCII range, or a `bytes`.

This is confusing for new comer because:

1. When you send your mail using only ASCII characters, everything is fine (no matter you use bytes or str).
2. When sometimes you included non-ASCII characters in your email, the traceback is hard to understand.

Here's an example of such traceback:

Traceback (most recent call last):
  File "./", line 113, in <module>
  File "/data/web/cgi-bin/venv/lib/python3.3/site-packages/flask_script/", line 405, in run
    result = self.handle(sys.argv[0], sys.argv[1:])
  File "/data/web/cgi-bin/venv/lib/python3.3/site-packages/flask_script/", line 384, in handle
    return handle(app, *positional_args, **kwargs)
  File "/data/web/cgi-bin/venv/lib/python3.3/site-packages/flask_script/", line 145, in handle
    return*args, **kwargs)
  File "./", line 108, in run
  File "/data/web/cgi-bin/venv/lib/python3.3/site-packages/", line 168, in send
  File "/data/web/cgi-bin/python-3.3.3/lib/python3.3/", line 747, in sendmail
    msg = _fix_eols(msg).encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode character '\u9f99' in position 646: ordinal not in range(128)

Here's my proposal:

---     2014-02-01 21:26:47.000000000 -0500
+++  2014-02-01 21:37:51.000000000 -0500
@@ -744,7 +744,12 @@
         esmtp_opts = []
         if isinstance(msg, str):
-            msg = _fix_eols(msg).encode('ascii')
+            try:
+                msg = _fix_eols(msg).encode('ascii')
+            except UnicodeEncodeError:
+                raise SMTPException(
+                    "msg may be a string containing characters in the "
+                    "ASCII range, or a byte string.")
         if self.does_esmtp:
             # Hmmm? what's this? -ddm
             # self.esmtp_features['7bit']=""
Date User Action Args
2014-02-02 02:41:28yeglesetrecipients: + yegle, barry, r.david.murray
2014-02-02 02:41:28yeglesetmessageid: <>
2014-02-02 02:41:27yeglelinkissue20482 messages
2014-02-02 02:41:27yeglecreate