Python send 3 smtplib com caracteres Unicode
-
07-07-2019 - |
Pergunta
Eu estou tendo um problema enviando caracteres unicode usando smtplib em Python 3. Isso falha em 3.1.1, mas funciona em 2.5.4:
import smtplib
from email.mime.text import MIMEText
sender = to = 'ABC@DEF.com'
server = 'smtp.DEF.com'
msg = MIMEText('€10')
msg['Subject'] = 'Hello'
msg['From'] = sender
msg['To'] = to
s = smtplib.SMTP(server)
s.sendmail(sender, [to], msg.as_string())
s.quit()
Eu tentei um exemplo dos documentos, que também falhou. http://docs.python.org/3.1/library/email-examples. html , a enviar o conteúdo de um diretório como um exemplo de mensagem MIME
Todas as sugestões?
Solução
A chave está em o docs :
class email.mime.text.MIMEText(_text, _subtype='plain', _charset='us-ascii')
A subclasse de MIMENonMultipart, o classe MimeText é usado para criar MIME objetos de grande texto tipo. _TEXT é a corda para a carga útil. _subtype é o tipo menor e padrões para avião. _charset é o conjunto de caracteres do texto e é passado como um parâmetro para o MIMENonMultipart construtor; o padrão é us-ascii. Não se sabe ou codificação é realizada sobre os dados de texto.
Então, o que você precisa é claramente, não msg = MIMEText('€10')
, mas sim:
msg = MIMEText('€10'.encode('utf-8'), _charset='utf-8')
Embora não seja tudo o que claramente documentados, sendmail precisa de um byte-string, não um Unicode um (que é o que especifica protocolo SMTP); olhar para o que msg.as_string()
olhares como para cada uma das duas maneiras de construí-lo - dada a "nenhuma suposição ou codificação", o seu caminho ainda tem esse caráter euro lá (e não há maneira para o sendmail para transformá-lo em um bytestring), mina não (e utf-8 está claramente especificado em todo).
Outras dicas
parâmetro _charset
de inadimplência MIMEText
para us-ascii
de acordo com o docs . Desde €
não é de set us-ascii não está funcionando.
exemplo nos docs que você tentou claramente afirma:
Para este exemplo, suponha que o arquivo de texto contém apenas caracteres ASCII.
Você pode usar .get_charset
método em sua mensagem para investigar o charset, há aliás .set_charset
também.
Gus Mueller teve um problema semelhante: http://bugs.python.org/issue4403