1
votes

I'm in the process of migrating a Django project from 1.3 to 1.5.

One app that sends emails is not working now in 1.5 in my development machine. I get this error:

UnicodeEncodeError at /envia_activacion/ 'ascii' codec can't encode character u'\xf3' in position 37: ordinal not in range(128)

Traceback:
File "/home/django/.virtualenvs/migracion/lib/python2.6/site-packages/django/core/handlers/base.py" in get_response
  115.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/django/clones/migracion/libs/my_apps/emailing/views.py" in envia_email
  48.         mailer.msg.send()
File "/home/django/.virtualenvs/migracion/lib/python2.6/site-packages/django/core/mail/message.py" in send
  255.         return self.get_connection(fail_silently).send_messages([self])
File "/home/django/.virtualenvs/migracion/lib/python2.6/site-packages/django/core/mail/backends/smtp.py" in send_messages
  95.                 sent = self._send(message)
File "/home/django/.virtualenvs/migracion/lib/python2.6/site-packages/django/core/mail/backends/smtp.py" in _send
  113.                     force_bytes(message.as_string(), charset))
File "/home/django/.virtualenvs/migracion/lib/python2.6/site-packages/django/core/mail/message.py" in as_string
  169.         g.flatten(self, unixfrom=unixfrom)
File "/usr/lib/python2.6/email/generator.py" in flatten
  84.         self._write(msg)
File "/usr/lib/python2.6/email/generator.py" in _write
  109.             self._dispatch(msg)
File "/usr/lib/python2.6/email/generator.py" in _dispatch
  135.         meth(msg)
File "/usr/lib/python2.6/email/generator.py" in _handle_multipart
  201.             g.flatten(part, unixfrom=False)
File "/usr/lib/python2.6/email/generator.py" in flatten
  84.         self._write(msg)
File "/usr/lib/python2.6/email/generator.py" in _write
  109.             self._dispatch(msg)
File "/usr/lib/python2.6/email/generator.py" in _dispatch
  135.         meth(msg)
File "/usr/lib/python2.6/email/generator.py" in _handle_text
  178.         self._fp.write(payload)

Exception Type: UnicodeEncodeError at /envia_activacion/
Exception Value: 'ascii' codec can't encode character u'\xf3' in position 37: ordinal not in range(128)

My code is this:

plaintext = get_template('emailing/activacion.txt')
htmly = get_template('emailing/activacion.html') //html template with utf-8 charset
d = Context({
    'code': code,
    'version': sVersion,
    'activacion': activacion,
    'distribuidor': distribuidor,
    'contacto': contacto,
    'departamento': departamento,
    'empresa': empresa
             })

asunto = u'Código activación %s - V%s - Code: %s' % (nombre_destinatario, version, code)
text_content = plaintext.render(d)
html_content = htmly.render(d)

msg = EmailMultiAlternatives(asunto, text_content, remitente, para, [remitente], headers={'Reply-To': remitente})
msg.attach_alternative(html_content, "text/html")//This is what makes it fail

msg.send()

This works in django 1.3, don't know in django 1.4.

Debugging, I see the text that fails is unicode:

> /usr/lib/python2.6/email/generator.py(178)_handle_text()
-> self._fp.write(payload)
(Pdb) s
UnicodeEncodeError: UnicodeE...ge(128)')
> /usr/lib/python2.6/email/generator.py(178)_handle_text()
-> self._fp.write(payload)
(Pdb) payload
u'Apreciado cliente, le indicamos los c\xf3digos necesarios ...'

I'm using python 2.6.5. I've reviewed this ticket that looks almost the same https://code.djangoproject.com/ticket/19107 but in django 1.5 that patch already exists and I'm still getting this error.

Related: unicode error in python

I would really appreciate any help. Thanks

1

1 Answers

2
votes

Your payload is a unicode instance (note that Django strives to only use unicode internally) while it should be str instance. It's your responsability to pass a (preferably properly encoded) str. Which is quite easy FWIW:

# I assume you use utf-8 everywhere 
text_content = plaintext.render(d).encode("utf-8")
html_content = htmly.render(d).encode("utf-8")