Python 3 smtplib отправить с символами Юникода
-
07-07-2019 - |
Вопрос
У меня проблема с отправкой по электронной почте символов Юникода с помощью smtplib в Python 3. Это не работает в 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 объекты основного типа текста. _текст строка для полезной нагрузки. _subtype является второстепенным типом и по умолчанию равнина. _charset это набор символов текста и передается как параметр для MIMENonMultipart конструктор; это по умолчанию для нас-ascii. Нет угадывания или кодирования не выполняется на текстовые данные.
То, что вам нужно, это ясно, не msg = MIMEText ('& # 8364; 10')
, а скорее:
msg = MIMEText('€10'.encode('utf-8'), _charset='utf-8')
Хотя не все это четко задокументировано, sendmail нужна строка байтов, а не Unicode (это то, что указывает протокол SMTP); Посмотрите, как выглядит msg.as_string ()
для каждого из двух способов его построения - учитывая «без догадок и кодировок», ваш путь по-прежнему содержит этот знак евро (и нет способ для sendmail превратить его в строку байтов), а мой - нет (а utf-8 четко указан везде).
Другие советы
_charset
MIMEText
по умолчанию равен us-ascii
в соответствии с документы . Поскольку & # 8364;
не из набора us-ascii, он не работает.
пример в документах, которые вы пробовали, ясно показывает:
В этом примере предположим, что текстовый файл содержит только символы ASCII.
Вы можете использовать . Метод get_charset
в вашем сообщении для исследования кодировки, кстати, есть и .set_charset
.
У Гуса Мюллера была похожая проблема: http://bugs.python.org/issue4403 р>