smtpllib.server sendmail метод ожидает bytes
неадекватность;если он получает str
, он пытается закодировать его в ASCII, что приводит к UnicodeEncodeError
, если str
содержит любые не-ASCII символы.
Вы можете обойти это, кодируя сообщение самостоятельно:
>>> msg = 'Hello Wørld'
>>> from_ = 'a@example.com'
>>> to_ = 'b@example.com'
>>> subject = 'Hello'
>>> fmt = 'From: {}\r\nTo: {}\r\nSubject: {}\r\n{}'
>>> server.sendmail(to_, from_, fmt.format(to_, from_, subject, msg).encode('utf-8'))
{}
Это отправит это сообщение *:
b'From: b@example.com'
b'To: a@example.com'
b'Subject: Hello'
b'Hello W\xc3\xb8rld'
Однако этот обходной путь не будет работать, если вы хотите отправить нетекстовые двоичные данные с вашим сообщением.
Лучшее решение - использовать класс EmailMessage из пакета электронной почты.
>>> from email.message import EmailMessage
>>> em = EmailMessage()
>>> em.set_content(fmt.format(to_, from_, subject, msg))
>>> em['To'] = to_
>>> em['From'] = from_
>>> em['Subject'] = subject
>>> # NB call the server's *send_message* method
>>> server.send_message(em)
{}
Отправляет это сообщение;обратите внимание на дополнительные заголовки, сообщающие получателю используемую кодировку:
b'Content-Type: text/plain; charset="utf-8"'
b'Content-Transfer-Encoding: 8bit'
b'MIME-Version: 1.0'
b'To: b@example.com'
b'From: a@example.com'
b'Subject: Hello'
b'X-Peer: ::1'
b''
b'From: b@example.com'
b'To: a@example.com'
b'Subject: Hello'
b'Hello W\xc3\xb8rld'
* Запустите команду python -m smtpd -n -c DebuggingServer localhost:1025
в отдельном терминале для сбора данных сообщения.