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 <1391308888.03.0.522502415802.issue20482@psf.upfronthosting.co.za>
In-reply-to
Content
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 "./manage.py", line 113, in <module>
    manager.run()
  File "/data/web/cgi-bin/venv/lib/python3.3/site-packages/flask_script/__init__.py", 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/__init__.py", line 384, in handle
    return handle(app, *positional_args, **kwargs)
  File "/data/web/cgi-bin/venv/lib/python3.3/site-packages/flask_script/commands.py", line 145, in handle
    return self.run(*args, **kwargs)
  File "./manage.py", line 108, in run
    conn.send(msg)
  File "/data/web/cgi-bin/venv/lib/python3.3/site-packages/flask_mail.py", line 168, in send
    message.as_string())
  File "/data/web/cgi-bin/python-3.3.3/lib/python3.3/smtplib.py", 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:

--- smtplib.py.orig     2014-02-01 21:26:47.000000000 -0500
+++ smtplib.py  2014-02-01 21:37:51.000000000 -0500
@@ -744,7 +744,12 @@
         esmtp_opts = []
         print(msg)
         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']=""
History
Date User Action Args
2014-02-02 02:41:28yeglesetrecipients: + yegle, barry, r.david.murray
2014-02-02 02:41:28yeglesetmessageid: <1391308888.03.0.522502415802.issue20482@psf.upfronthosting.co.za>
2014-02-02 02:41:27yeglelinkissue20482 messages
2014-02-02 02:41:27yeglecreate