Issue 15763: email non-ASCII characters in TO or FROM field doesn't work (original) (raw)

Trying to generate an email with Latin-1 characters in the TO or FROM field either produces an exception or produces strange values in the generated email:

Using Python 3.2.3+ (3.2:481f5d9ef577+, Aug 8 2012, 10:00:28)

#!/usr/bin/python3 #-- coding: latin1 --

import smtplib from email.message import Message import datetime import sys

msg= Message() msg.set_charset('latin-1') msg['Subject'] = "*** Email Test ***"

the following gives a UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc ..

in File "/usr/lib64/python3.2/email/header.py", line 281, in append

msg['From'] = FromAddr = "Günter Groß <Email_Tester@numa-sv.igpm.rwth-aachen.de>".encode('iso-8859-1')

The following doesn't crash Python but generates a strange "From" string :

=?utf-8?b?R8O8bnRlciBHcm/DnyA8RW1haWxfVGVzdGVyQG51bWEtc3YuaWdwbS5yd3RoLWFhY2hlbi5kZT4=?=

msg['From'] = FromAddr = "Günter Groß <Email_Tester@numa-sv.igpm.rwth-aachen.de>"

The same with this one

msg['To'] = ToAddr = "Günter Weiße <jarausch@igpm.rwth-aachen.de>"

DATE = datetime.datetime.utcnow().strftime('%m/%d/%Y %I:%M:%S %p') msg['Date'] = datetime.datetime.utcnow().strftime('%m/%d/%Y %I:%M:%S %p')

server= smtplib.SMTP("igpm.igpm.rwth-aachen.de")

server= smtplib.SMTP('relay.skynet.be')

server.set_debuglevel(9)

msg.set_payload("Gedanken über einen Test","iso-8859-1")

server.send_message(msg)

server.sendmail(FromAddr,ToAddr,msg.as_string().encode("iso-8859-1")) server.quit()

Doing non-ASCII email in python before 3.3 is a bit of a pain and not as well documented as it should be. 3.3 will work more like you expect, if you use the new provisional policies (which are intended to become standard in 3.4, after a the bake-in period in 3.3).

For 3.2, you need to handle encoding addresses using utils.formataddr and header.Header:

h = Header(header_name='Sender') h.append("Éric", 'latin-1') h.append('<eric@example.com>') h.encode() '=?iso-8859-1?q?=C9ric?= <eric@example.com>' m = Message() m['Sender'] = h print(m) Sender: =?iso-8859-1?q?=C9ric?= <eric@example.com>

In 3.3 this will work:

m = Message() m['Sender'] = formataddr(('Éric', 'eric@example.com')) print(m) Sender: =?iso-8859-1?q?=C9ric?= <eric@example.com>

But even better, so will this:

m = Message(policy=policy.SMTP) m['From'] = "Günter Weiße <jarausch@igpm.rwth-aachen.de>" print(m) From: =?utf-8?q?G=C3=BCnter_Wei=C3=9Fe?= <jarausch@igpm.rwth-aachen.de>