MIMEText UTF-8 кодирует проблемы при отправке электронной почты - PullRequest
14 голосов
/ 17 ноября 2011

Вот часть моего кода, которая отправляет электронное письмо:

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?

1 Ответ

39 голосов
/ 18 ноября 2011

Похоже, что в python3 объект Header необходим для кодирования Subject как "utf-8":

>>> from email.mime.text import MIMEText
>>> from email.header import Header
>>> s = 'ação'
>>> m = MIMEText(s.encode('utf-8'), 'plain', 'utf-8')
>>> m['Subject'] = Header(s, 'utf-8')
>>> 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.encode('utf-8'), 'plain', 'utf-8')
corpo['From'] = user
corpo['To'] = para
corpo['Subject'] = Header(assunto, 'utf-8')
servidor.sendmail(user, [para], corpo.as_string())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...