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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top