email with a non-ascii charset in Python3 ?

Helmut Jarausch jarausch at skynet.be
Wed Aug 15 10:04:51 EDT 2012


On Wed, 15 Aug 2012 14:48:40 +0200, Christian Heimes wrote:

> Am 15.08.2012 14:16, schrieb Helmut Jarausch:
>> Hi,
>> 
>> I'm sorry to ask such a FAQ but still I couldn't find an answer -
>> neither in the docs nor the web.
>> 
>> What's wrong with the following script?
>> 
>> Many thanks for a hint,
>> Helmut.
>> 
>> #!/usr/bin/python3 #_*_ coding: latin1 _*_
>> 
>> import smtplib from email.message import Message import datetime
>> 
>> msg= Message()
>> msg.set_charset('latin-1')
>> msg['Subject'] = "*** Email Test ***"
>> msg['From'] = "Email_Tester at numa-sv.igpm.rwth-aachen.de"
>> msg['To']   = "jarausch at igpm.rwth-aachen.de"
>> msg['Date'] = datetime.datetime.utcnow().strftime('%m/%d/%Y %I:%M:%S
>> %p')
>> 
>> server= smtplib.SMTP("igpm.igpm.rwth-aachen.de")
>> msg.set_payload("Gedanken über einen Test","iso-8859-1")
> 
> You mustn't combine set_charset() with set_payload() with a charset.
> That results into invalid output:
> 
>>>> msg = Message()
>>>> msg.set_payload("Gedanken über einen Test", "iso-8859-1")
>>>> msg.as_string()
> 'MIME-Version: 1.0\nContent-Type: text/plain;
> charset="iso-8859-1"\nContent-Transfer-Encoding:
> quoted-printable\n\nGedanken =FCber einen Test'
> 
>>>> msg2 = Message()
>>>> msg2.set_charset("iso-8859-1")
>>>> msg2.set_payload("Gedanken über einen Test", "iso-8859-1")
>>>> msg2.as_string()
> 'MIME-Version: 1.0\nContent-Type: text/plain;
> charset="iso-8859-1"\nContent-Transfer-Encoding:
> quoted-printable\n\nGedanken über einen Test'
> 


Thanks!
Just, one mustn't use 
server.send_message(msg.as_string())

But what if msg['From'] contains a non-ASCII character?

I wonder what the usage of msg.set_charset('latin-1') is.

With
msg.set_charset('latin-1') 
msg.set_payload("Gedanken über einen Test")  # is accepted BUT
server.send_message(msg)

gives
Traceback (most recent call last):
  File "Test_EMail_Py3_2.py", line 21, in <module>
    server.send_message(msg)
  File "/usr/lib64/python3.2/smtplib.py", line 812, in send_message
    g.flatten(msg_copy, linesep='\r\n')
  File "/usr/lib64/python3.2/email/generator.py", line 91, in flatten
    self._write(msg)
  File "/usr/lib64/python3.2/email/generator.py", line 137, in _write
    self._dispatch(msg)
  File "/usr/lib64/python3.2/email/generator.py", line 163, in _dispatch
    meth(msg)
  File "/usr/lib64/python3.2/email/generator.py", line 396, in 
_handle_text
    super(BytesGenerator,self)._handle_text(msg)
  File "/usr/lib64/python3.2/email/generator.py", line 201, in 
_handle_text
    self.write(payload)
  File "/usr/lib64/python3.2/email/generator.py", line 357, in write
    self._fp.write(s.encode('ascii', 'surrogateescape'))
UnicodeEncodeError: 'ascii' codec can't encode character '\xfc' in 
position 9: ordinal not in range(128)

Helmut.







More information about the Python-list mailing list