Python 3 smtplib отправить с символами Юникода - PullRequest
8 голосов
/ 15 сентября 2009

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

Есть предложения?

Ответы [ 3 ]

13 голосов
/ 16 сентября 2009

Ключ в документах :

class email.mime.text.MIMEText(_text, _subtype='plain', _charset='us-ascii')

Подкласс MIMENonMultipart, MIMEText класс используется для создания MIME объекты основного типа текста. _текст строка для полезной нагрузки. _subtype является второстепенным типом и по умолчанию равнина. _charset это набор символов текста и передается как параметр для MIMENonMultipart конструктор; это по умолчанию для нас-ascii. Нет угадывания или кодирования не выполняется по текстовым данным.

То, что вам нужно, это явно, не msg = MIMEText('€10'), а скорее:

msg = MIMEText('€10'.encode('utf-8'), _charset='utf-8')

Хотя не все это четко задокументировано, sendmail нуждается в байтовой строке, а не в Unicode (это то, что определяет протокол SMTP); Посмотрите, как выглядит msg.as_string() для каждого из двух способов его построения - учитывая, что «нет угадывания или кодирования», ваш путь все еще содержит этот символ евро (и у sendmail нет способа превратить его в строку байтов) у меня нет (и utf-8 четко указан везде).

2 голосов
/ 15 сентября 2009

_charset параметр MIMEText по умолчанию us-ascii в соответствии с документами . Поскольку не из набора us-ascii, он не работает.

пример в документах, которые вы пробовали, четко гласит:

Для этого примера предположим, что текстовый файл содержит только символы ASCII.

Вы можете использовать метод .get_charset в своем сообщении, чтобы исследовать кодировку, также есть случайный .set_charset.

1 голос
/ 15 февраля 2010

У Гаса Мюллера была похожая проблема: http://bugs.python.org/issue4403

...