1
我正在將Django項目從1.3遷移到1.5。Django 1.5 UnicodeEncodeError在電子郵件中使用attach_alternative
發送電子郵件的一個應用程序現在在我的開發機器中不能工作。我得到這個錯誤:
UnicodeEncodeError在/ envia_activacion/ 'ASCII' 編解碼器無法編碼的字符的u '\ XF3' 在位置37:在範圍序數不(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)
我的代碼是這個:
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()
這在django 1.3中工作,不知道在django 1.4。
調試,我看到失敗的文本是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 ...'
我使用python 2.6.5。我已經查看了這個票看起來幾乎相同https://code.djangoproject.com/ticket/19107,但在Django 1.5補丁已經存在,我仍然得到這個錯誤。
我真的很感激任何幫助。謝謝
好極了,很簡單。我曾嘗試過僅編碼html內容。現在它工作了!非常感謝布魯諾。 – equalium 2013-04-05 13:00:44
我認爲這裏有一個更大的問題 - 雖然我相信布魯諾的建議在這種情況下起作用,但不應該需要它,因爲我認爲Django的內部電子郵件處理/編碼應該自行轉換爲UTF-8。 編輯此外,我的測試表明,這個(OP的代碼)在Python 2.7.x中工作得很好,但在OP上沒有2.6.x。 – 2013-04-09 17:58:48
感謝James抽出時間來測試這一點,我也認爲還有其他事情正在進行,因爲正如我所說的,在嘗試從django 1.3遷移之前,我並不需要此修復。 – equalium 2013-04-11 10:45:44