Ключ в документах :
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 четко указан везде).