web-dev-qa-db-ja.com

電子メールを送信するときのMIMETextUTF-8エンコードの問題

これがメールを送信する私のコードの一部です:

servidor = smtplib.SMTP()
servidor.connect(Host, PORT)
servidor.login(user, usenha)
assunto = str(self.lineEdit.text())
para = str(globe_email)             
texto = self.textEdit.toPlainText()
textos = str(texto)
corpo = MIMEText(textos.encode('utf-8'), _charset='utf-8')
corpo['From'] = user
corpo['To'] = para
corpo['Subject'] = assunto
servidor.sendmail(user, [para], corpo.as_string())

件名の一部を除いて、すべて問題ありません。特殊文字(「ação」など)を含む文字列を送信しようとすると、次のエラーが発生します。

UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128)

MIMETextの件名に特殊文字を含む電子メールを送信するにはどうすればよいですか?

16
jonathan.hepp

Python3では、Headerをutf-8としてエンコードするには、 Subject オブジェクトが必要なようです。

# -*- coding: utf-8 -*-
from email.mime.text import MIMEText
from email.header import Header
s = 'ação'
m = MIMEText(s, 'plain', 'utf-8')
m['Subject'] = Header(s, 'utf-8')
print(repr(m.as_string()))

出力:

'Content-Type: text/plain; charset="utf-8"\nMIME-Version: 1.0\nContent-Transfer-Encoding: base64\nSubject: =?utf-8?b?YcOnw6Nv?=\n\nYcOnw6Nv\n

したがって、元のスクリプトは次のようになります。

servidor = smtplib.SMTP()
servidor.connect(Host, PORT)
servidor.login(user, usenha)
assunto = str(self.lineEdit.text())
para = str(globe_email)             
texto = str(self.textEdit.toPlainText())
corpo = MIMEText(texto, 'plain', 'utf-8')
corpo['From'] = user
corpo['To'] = para
corpo['Subject'] = Header(assunto, 'utf-8')
servidor.sendmail(user, [para], corpo.as_string())
43
ekhumoro