Функция smtplib.server.sendmail в python вызывает UnicodeEncodeError: кодек «ascii» не может кодировать символ - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь отредактировать текстовый файл, а затем отправить его как текст сообщения электронной почты с использованием скрипта Python, но я получаю ошибку кодирования Unicode.После некоторых исследований я обнаружил, что решение заключается в использовании метода .encode ('utf-8'), но это не помогает мне, так как метод sendmail () отправляет только строки

Вот фрагмент кода Python, который я использую:

irtem = open('irtemplate.txt')
data = irtem.read().replace('(name)', eng_name).replace('(customer)', 
cu_name).replace('(sr)', SR_num).replace('(problem)', 
prob_description).replace('(email)', eng_email).replace('(details)', 
details_req).replace('(tele)', eng_tele)


message_text = data
message = "From: %s\r\n" % fromaddr + "To: %s\r\n" % toaddr + "CC: 
%s\r\n" % ",".join(cc) + "Subject: %s\r\n" % message_subject + "\r\n" + 
message_text
toaddrs = [toaddr] + cc + bcc
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, message)
server.quit()

Traceback:

Traceback (most recent call last):
File "autoIR.py", line 39, in <module>
server.sendmail(fromaddr, toaddrs, message)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/smtplib.py", line 855, in sendmail
msg = _fix_eols(msg).encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode character '\u2019' in 
position 168: ordinal not in range(128)

1 Ответ

0 голосов
/ 24 февраля 2019

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 в отдельном терминале для сбора данных сообщения.

...