Вопрос

У меня проблема с отправкой по электронной почте символов Юникода с помощью 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top