2016-04-04 15 views
1

この例をpython docsから変更して、電子メールモジュールのunicodeをテストしました。ユニコードでHTMLメールを送信する

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
from __future__ import absolute_import, division, unicode_literals, print_function 

import smtplib 

from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 

# me == my email address 
# you == recipient's email address 
me = "[email protected]" 
you = "[email protected]" 

umlauts='German Umlauts: üöä ÜÖÄ ß' 

# Create message container - the correct MIME type is multipart/alternative. 
msg = MIMEMultipart('alternative') 
msg['Subject'] = umlauts 
msg['From'] = me 
msg['To'] = you 

# Create the body of the message (a plain-text and an HTML version). 
text = umlauts 
html = """\ 
<html> 
    <head></head> 
    <body> 
    <p>Hi!<br> 
     %s 
    </p> 
    </body> 
</html> 
""" % umlauts 

# Record the MIME types of both parts - text/plain and text/html. 
part1 = MIMEText(text, 'plain') 
part2 = MIMEText(html, 'html') 

# Attach parts into message container. 
# According to RFC 2046, the last part of a multipart message, in this case 
# the HTML message, is best and preferred. 
msg.attach(part1) 
msg.attach(part2) 

# Send the message via local SMTP server. 
s = smtplib.SMTP('localhost') 
# sendmail function takes 3 arguments: sender's address, recipient's address 
# and message to send - here it is sent as one string. 
s.sendmail(me, you, msg.as_string()) 
s.quit() 

出典:https://docs.python.org/2/library/email-examples.html#id4

私はこの例外を取得:

[email protected]:~$ python src/sendhtmlmail.py 
Traceback (most recent call last): 
    File "src/sendhtmlmail.py", line 37, in <module> 
    part1 = MIMEText(text, 'plain') 
    File "/usr/lib/python2.7/email/mime/text.py", line 30, in __init__ 
    self.set_payload(_text, _charset) 
    File "/usr/lib/python2.7/email/message.py", line 226, in set_payload 
    self.set_charset(charset) 
    File "/usr/lib/python2.7/email/message.py", line 262, in set_charset 
    self._payload = self._payload.encode(charset.output_charset) 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 16-18: ordinal not in range(128) 

テキスト+ HTMLメールを送信したい場合はUnicodeを処理するためにどのように?

答えて

8

明示的にUTF-8にそれをエンコードする必要があります。

part1 = MIMEText(text.encode('utf-8'), 'plain', 'utf-8') 
part2 = MIMEText(html.encode('utf-8'), 'html', 'utf-8') 

または、unicode_literalsのインポートは避けてください。文字列は最初の場所にあるバイトになります。

+0

Python3へのアップデートが遅かれ早かれ、すべてのファイルで 'unicode_literals'の将来のインポートを使用します。実際のコードでは、文字はdbであり、pythonのソースファイルではありません:-) – guettli