Ajuda formulário Flask. (UnicodeEncodeError)

174 views
Skip to first unread message

Felipe Cabral

unread,
Mar 6, 2014, 7:55:56 PM3/6/14
to python...@googlegroups.com
Pessoal, 

Antes de tudo vou pedir uma desculpas pela pergunta. Dei uma fuçada aqui do no fórum e não encontrei a solução e as mesmas que foram aplicadas em casos que tem alguma similaridade com o meu, não foram os bastantes para a resolução do meu problema.

Basicamente tenho que mandar um formulário para um e-mail

Estou utilizando o flask-mail para fazer a parte do envio de email com os dados que recebo no formulário.

Dentro do meu projeto tenho o seguinte:


app = Flask(__name__)
app.config.from_object(__name__)
app.config.update(dict(
    DEBUG = True,
    MAIL_SERVER = 'smtp.google.com',
    MAIL_PORT = 465,
    MAIL_USE_TLS = True,
    MAIL_USE_SSL = True,
    MAIL_USERNAME = 'em...@gmail.com',
    MAIL_PASSWORD = 'senha',

))
mail = Mail(app)

@app.route('/send-contact', methods=['POST'])
def add_entry(): 
nome = request.form['nome']
sobrenome = request.form['sobrenome']
cargo = request.form['cargo']
empresa = request.form['empresa']
endereco = request.form['endereco']
cidade = request.form['cidade']
estado = request.form['estado']
ddd = request.form['ddd']
telefone = request.form['telefone']
email = request.form['email']
mensagem = request.form['mensagem']


msg = Message("Empresa :: Contato pelo formulário", sender="con...@empresa.com.br", recipients=["pes...@gmail.com"])

msg.html = (u'<ul><li>Nome: %s</li><li>Sobrenome: %s</li><li>Cargo: %s</li><li>Empresa: %s</li><li>Cidade: %s</li><li>Endereco: %s</li><li>Estado: %s</li><li>DDD: %s</li><li>Telefone: %s</li><li>E-mail: %s</li><li>Mensagem: %s</li></ul>' % (nome, sobrenome, cargo, empresa, endereco, cidade, estado, ddd, telefone, email, mensagem,))
mail.send(msg)
logging.info('saiu da classe teste')
return render_template('contato-enviado.html')



Consigo receber os dados na outra ponta  passados pelo formulário porém ao tentar envia-los por e-mail é apresentado o seguinte erro:

"UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 69: ordinal not in range(128)"


Juro que procurei um bocado, talvez vocês digam que não foi o suficiente, e mesmo assim não consegui encontrar a solução.

O mais engraçado, caso tenha alguma, e que quando dou um print da mensagem no log ou até mesmo no console, ela sai normal, com a respectiva acentuação e etc.
Quando seto a mensagem estaticamente ou seja, ao invés de mensagem = request.form['mensagem'] coloco mensagem = 'minha mensagem com acentuação' ele consegue enviar normalmente. 

Alguém poderia da uma ajuda para o casa.

Desde já agradeço a atenção.

Marcos Thomaz

unread,
Mar 6, 2014, 7:58:28 PM3/6/14
to python...@googlegroups.com
Você colocou na primeira linha do arquivo a indicação do encoding??

# -*- coding: utf-8 -*- 

??


--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo quot;Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--


Marcos Thomaz da Silva
Analista de Tecnologia da Informação

Felipe Cabral

unread,
Mar 6, 2014, 8:02:33 PM3/6/14
to python...@googlegroups.com
Opa, desculpa não havia mencionado isso mas a resposta é sim, coloquei # -*- coding: utf-8 -*-.


Você recebeu essa mensagem porque está inscrito em um tópico no grupo "Python Brasil" dos Grupos Google.
Para cancelar inscrição nesse tópico, acesse https://groups.google.com/d/topic/python-brasil/hzbYt4dNI6A/unsubscribe.
Para cancelar inscrição nesse grupo e todos os seus tópicos, envie um e-mail para python-brasi...@googlegroups.com.

Renzo Nuccitelli

unread,
Mar 6, 2014, 8:59:12 PM3/6/14
to python...@googlegroups.com
Não sei no Flask, mas no App Engine eu sempre coloco como primeiro import:

from __future__ import unicode_literals

 Assim eu não tenho essas problemas, uma vez que o Jinja2 trabalha com utf8. Veja se funciona aí também.

--
  Renzo Nuccitelli

Renzo Nuccitelli

unread,
Mar 6, 2014, 8:59:53 PM3/6/14
to python...@googlegroups.com
Em particular essa era uma das poucas vantagens que eu via no Java, mas que o Python já "consertou" na versão 3...

--
  Renzo Nuccitelli

Felipe Cabral

unread,
Mar 6, 2014, 9:33:07 PM3/6/14
to python...@googlegroups.com
Opa Renzo.

Estou tentando achar essa solução de unicode com um amigo. Incrivelmente o que você citou nas duas resposta, foi exatamente o que comentei com ele. O java tanto no webservice, jsp, etc, não da esse tipo de erro, da outros em muitas vezes impossíveis de descobrir, mas esse não :D.

Com relação ao  from __future__ import unicode_literals utilizando o Python 2.7.5, não funcionou.
Estou tentando realizar a instalação do python 3 no virtualenvi, para testar esse meu projeto. Caso venha rodar, vou fazer um upgrade no servidor.


Forte abraço e obrigado mais uma vez pela ajuda!

Rafael Vogel

unread,
Mar 6, 2014, 9:33:23 PM3/6/14
to python...@googlegroups.com
O problema não é nessa linha não:

msg = Message("Empresa :: Contato pelo formulário", sender="con...@empresa.com.br", recipients=["pes...@gmail.com"])

Mais especificamente no "á" de "formulário"?

Abcs,

Rafael Vogel

Marcos Thomaz

unread,
Mar 6, 2014, 9:36:17 PM3/6/14
to python...@googlegroups.com
Felipe, em qual das linhas exatamente está ocorrendo o problema? Na atribuição do HTML ou no send??

Felipe Cabral

unread,
Mar 6, 2014, 10:00:24 PM3/6/14
to python...@googlegroups.com
Opa Marcos, Obrigado pelo interesse no assunto.

Examinei o log e percebi que o erro ocorre no send.

Alguma sugestão?

Abraços.

Marcos Thomaz

unread,
Mar 6, 2014, 10:07:46 PM3/6/14
to python...@googlegroups.com
Antes da linha do send, tente assim:

msg.html = msg.html.decode('utf-8')


Felipe Cabral

unread,
Mar 6, 2014, 10:31:10 PM3/6/14
to python...@googlegroups.com
Marcos,

o erro passou a ser na linha em que adicionei sua sugestão.
A mensagem e a seguinte:

File "TESTS-FELIPE.py", line 56, in add_entry

    msg.html = msg.html.decode('utf-8')
  File "/Users/felipecabral/.virtualenvs/flask/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)

Acha que esse "paciente" tem volta?

:D!


Obrigado!

Marcos Thomaz

unread,
Mar 6, 2014, 10:52:14 PM3/6/14
to python...@googlegroups.com
se você colocar
msg.html = msg.html.encode('utf-8')
Dá erro???


Felipe Cabral

unread,
Mar 6, 2014, 11:16:14 PM3/6/14
to python...@googlegroups.com
Marcos,

Na mensagem anterior, você tinha mandado "msg.html = msg.html.decode('utf-8')" e não msg.html = msg.html.encode('utf-8') como nesta ultima.

Mas independente disso, é só felicidade. Funcionou 100%.

Eu estava tentando fazer este em um passo anterior, quando passo o meu request para uma variável.

Valeu mesmo!!

Obrigado a todos.

Marcos Thomaz

unread,
Mar 6, 2014, 11:17:51 PM3/6/14
to python...@googlegroups.com
Foi mesmo Felipe... foi mals heheh...

Felipe Cabral

unread,
Mar 6, 2014, 11:18:42 PM3/6/14
to python...@googlegroups.com
O importante e funcionar irmão...  aUAhaAU :D!!

edua...@itflex.net

unread,
Mar 7, 2014, 6:20:48 AM3/7/14
to python...@googlegroups.com
Tive um problema semelhante uma vez, não me lembro se era UnicodeEncodeError, mas o resto da mensagem de erro era esse. A solução que encontrei foi definir o encode padrão para utf-8 antes de fazer a manipulação das strings, ou seja no início do meu código.

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

Alysson Bruno

unread,
Mar 7, 2014, 6:22:51 AM3/7/14
to python-brasil
No histórico da lista Django tem um excelente e-mail do Ramalho sobre codificação no Python [1]. Recomendo que todos leiam, é uma ótima oportunidade de aprender.

Tem um artigo clássico também (original [2] e traduzido [3]), que é bem resumido, mas vale a leitura.




paz e amor (love and peace),

Alysson Bruno
===============================================
Palmas(TO)
Brasil

Blog: http://abruno.com


=================================================================
Meu alterego Escritor:

Leia alguns contos que escrevo, não esqueça de me dar sua opinião: http://goo.gl/Wjn4p

=================================================================

Renzo Nuccitelli

unread,
Mar 7, 2014, 7:10:36 AM3/7/14
to python...@googlegroups.com
Pois é, esse é um do os problemas do Python 2, principalmente para quem está começando. O Luciano está abordando o assunto em nosso curso introdutório PyPratico. Ele fez um programa desktop mostrando vários encodings, com animação, que é sensacional.

Abs,

--
  Renzo Nuccitelli
Reply all
Reply to author
Forward
0 new messages