8

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 メッセージとして送信する例

助言がありますか?

4

2 に答える 2

13

キーはドキュメントにあります:

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 プロトコルが指定するものです)。それを構築する2つの方法のそれぞれがどのmsg.as_string()ように見えるかを見てください-「推測やエンコードなし」を考えると、あなたの方法にはまだそのユーロ文字が含まれています(そしてsendmailがそれをバイト文字列に変換する方法はありません)、私のものはそうではありません't (そして utf-8 は全体を通して明確に指定されています)。

于 2009-09-16T02:00:56.690 に答える
2
于 2009-09-15T19:39:43.400 に答える