Python 3 smtplibはUnicode文字で送信します
-
07-07-2019 - |
質問
Python 3でsmtplibを使用してUnicode文字をメールで送信するのに問題があります。これは3.1.1では失敗しますが、2.5.4では動作します。
import smtplib
from email.mime.text import MIMEText
sender = to = 'ABC@DEF.com'
server = 'smtp.DEF.com'
msg = MIMEText('€10')
msg['Subject'] = 'Hello'
msg['From'] = sender
msg['To'] = to
s = smtplib.SMTP(server)
s.sendmail(sender, [to], msg.as_string())
s.quit()
ドキュメントから例を試してみましたが、やはり失敗しました。 http://docs.python.org/3.1/library/email-examples。 html 、MIMEメッセージとしてディレクトリの内容を送信する例
提案はありますか
解決
キーはドキュメントにあります:
class email.mime.text.MIMEText(_text, _subtype='plain', _charset='us-ascii')
MIMENonMultipartのサブクラス、 MIMETextクラスは、MIMEの作成に使用されます 主要なタイプのテキストのオブジェクト。 _textは ペイロードの文字列。 _subtype はマイナータイプで、デフォルトは プレーン。 _charsetは文字セットです テキストの MIMENonMultipartのパラメーター コンストラクタ;デフォルトはus-asciiです。 推測やエンコードは実行されません テキストデータ上。
必要なのは明らかに、ではなく msg = MIMEText( '€10')
ですが、むしろ:
msg = MIMEText('€10'.encode('utf-8'), _charset='utf-8')
すべてが明確に文書化されているわけではありませんが、 sendmail にはUnicode文字列ではなくバイト文字列が必要です(SMTPプロトコルで指定されているものです)。 msg.as_string()
を構築する2つの方法のそれぞれに似ていることを確認してください-「推測やエンコードなし」を考えると、あなたの方法にはまだユーロ文字が含まれています(そしてsendmailがバイト文字列に変換する方法)、私の場合はそうではありません(utf-8は全体にわたって明確に指定されています)。
他のヒント
MIMEText
の _charset
パラメーターは、€
はus-asciiセットのものではないため、機能しません。
試したドキュメントの例には次のように明記されています:
この例では、テキストファイルにASCII文字のみが含まれていると想定しています。
を使用できます。メッセージのget_charset
メソッドを使用して文字セットを調査します。付随的に .set_charset
もあります。
Gus Muellerにも同様の問題がありました: http://bugs.python.org/issue4403