Я работал со многими встроенными системами, где предупреждения приведут к нестабильности, катастрофическому отказу или повреждению памяти. Если Вы не знаете, что предупреждение безвредно, с ним нужно иметь дело.
The key is in the docs:
class email.mime.text.MIMEText(_text, _subtype='plain', _charset='us-ascii')
A subclass of MIMENonMultipart, the MIMEText class is used to create MIME objects of major type text. _text is the string for the payload. _subtype is the minor type and defaults to plain. _charset is the character set of the text and is passed as a parameter to the MIMENonMultipart constructor; it defaults to us-ascii. No guessing or encoding is performed на текстовых данных.
Итак, что вам нужно, очевидно, не msg = MIMEText ('€ 10')
, а скорее:
msg = MIMEText('€10'.encode('utf-8'), _charset='utf-8')
Хотя не все это четко задокументировано, sendmail нуждается в байтовой строке, а не в Unicode (это то, что определяет протокол SMTP); посмотрите, как msg.as_string ()
выглядит для каждого из двух способов его построения - учитывая «без угадывания или кодирования», в вашем способе все еще присутствует символ евро (и нет возможности для sendmail, чтобы превратить его в строку байтов), мой - нет (и utf-8 четко указан повсюду).
_charset
параметр MIMEText
по умолчанию us-ascii
согласно docs . Поскольку €
не из набора us-ascii, он не работает.
пример в документах, которые вы пробовали, четко заявляет:
В этом примере предположим, что текстовый файл содержит только Символы ASCII.
Вы можете использовать метод .get_charset
в своем сообщении, чтобы исследовать кодировку, кстати, есть и .set_charset
.
У Гаса Мюллера была аналогичная проблема: http://bugs.python.org/issue4403