Проблема с отправкой smtplib почты с символами юникода в Python 3.1

Здравствуйте, у меня проблема с электронными письмами в формате Unicode, когда я пытаюсь отправить слова на испанском языке, например: «Añadir» или другие, система рушится, я пробую то, что написано по этой ссылке: Python 3 smtplib отправляет с символами Юникода и не работает.

Это код моей ошибки:

server.sendmail(frm, to, msg.as_string())
g.flatten(self, unixfrom=unixfrom)
self._write(msg)
self._write_headers(msg)
header_name=h)
self.append(s, charset, errors)
input_bytes = s.encode(input_charset, errors)

UnicodeEncodeError: кодек 'ascii' не может кодировать символ '\ xf1' в позиции 7: порядковый номер не в диапазоне (128)

Это код на сервере:

msg = MIMEMultipart('alternative')
frm = "[email protected]"
msg['FROM'] = frm

to = "[email protected]"
msg['To'] = to
msg['Subject'] = "Favor añadir esta empresa a la lista"

_attach = MIMEText("""Nombre:Prueba; Dirección:Calle A #12.""".encode('utf-8'), _charset='utf-8')
msg.attach(_attach)

server.sendmail(frm, to, msg.as_string())

server.quit()

Заранее спасибо.


person hidura    schedule 30.11.2011    source источник


Ответы (3)


Вместо этого вы можете просто использовать:

msg = MIMEText(message, _charset="UTF-8")
msg['Subject'] = Header(subject, "utf-8")

Но в любом случае у вас все еще есть проблемы, если ваш frm = "[email protected]" или to = "[email protected]" содержит символы Unicode. Вы не можете использовать там заголовок.

person Kev    schedule 19.06.2012

Я решил это, решение такое:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

frm = "[email protected]"
msg = MIMEMultipart('alternative')

msg.set_charset('utf8')

msg['FROM'] = frm

bodyStr = ''
to = "[email protected]"
#This solved the problem with the encode on the subject.
msg['Subject'] = Header(
    body.getAttribute('subject').encode('utf-8'),
    'UTF-8'
).encode()

msg['To'] = to

# And this on the body
_attach = MIMEText(bodyStr.encode('utf-8'), 'html', 'UTF-8')        

msg.attach(_attach)

server.sendmail(frm, to, msg.as_string())

server.quit()

Надеюсь это поможет! Спасибо!

person Community    schedule 01.12.2011
comment
Я, наверное, что-то упускаю, но не вижу присвоения переменной body. - person fanny; 04.02.2016
comment
Также: server не определено. - person NuclearPeon; 11.03.2016

Я нашел здесь очень простой обходной путь (https://bugs.python.org/issue25736):

msg = '''your message with umlauts and characters here : <<|""<<>> ->ÄÄ">ÖÖÄÅ"#¤<%&<€€€'''
server.sendmail(mailfrom, rcptto, msg.encode("utf8"))
server.quit()

Итак, чтобы правильно кодировать эти символы Юникода, добавьте

msg.encode("utf8") 

в конце команды sendmail.

person jeppoo1    schedule 30.09.2019