2013-04-05 54 views
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補丁已經存在,我仍然得到這個錯誤。

相關: unicode error in python

我真的很感激任何幫助。謝謝

回答

2

你的負載是一個unicode實例(注意,Django努力在內部只使用unicode),而它應該是str實例。這是您通過(最好是正確編碼)str的責任。這很容易FWIW:

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

好極了,很簡單。我曾嘗試過僅編碼html內容。現在它工作了!非常感謝布魯諾。 – equalium 2013-04-05 13:00:44

+1

我認爲這裏有一個更大的問題 - 雖然我相信布魯諾的建議在這種情況下起作用,但不應該需要它,因爲我認爲Django的內部電子郵件處理/編碼應該自行轉換爲UTF-8。 編輯此外,我的測試表明,這個(OP的代碼)在Python 2.7.x中工作得很好,但在OP上沒有2.6.x。 – 2013-04-09 17:58:48

+0

感謝James抽出時間來測試這一點,我也認爲還有其他事情正在進行,因爲正如我所說的,在嘗試從django 1.3遷移之前,我並不需要此修復。 – equalium 2013-04-11 10:45:44