Кодировка электронной почты Django Mandrill
Редактировать Нашел решение: кажется, PDF-документ должен быть в кодировке base64. Редактирование асинхронного представления так работает:
import base64
result = export_pdf(request)
encoded = base64.b64encode(result.getvalue())
email = mandrill.Mandrill(settings.MANDRILL_API_KEY)
email.messages.send_template(mandrill_template, [], {'to':[{'email':user.email}], 'subject':subject, 'text':message, attachments':[{'type':'application/pdf', 'name':'pdf file', 'content':encoded}] })
конец редактирования
У меня проблема с отправкой документа PDF, созданного с помощью xhtml2pdf/pisa, в качестве приложения в Mandrill. Приложение работает следующим образом: content_view вызывает async_view
который
- генерирует PDF (вызывая функцию export_pdf) и
- отправляет письмо с приложением.
Документ в формате PDF кажется действительным (если я изменю async_view
в HttpResponse
PDF вместо отправки, я вижу действительный документ PDF). Но отправка его в Mandrill возвращает ошибку кодирования:
UnicodeDecodeError: кодек "utf8" не может декодировать байт 0x93 в позиции 11: недопустимый начальный байт.
Я попытался решить это, как упомянуто здесь ( Python: очистить строку для Unicode?). В этом случае ошибка больше не возникает, но PDF-файл, который я получаю в качестве вложения электронной почты, рассматривается как "текст / обычный" и не читается. Спасибо за помощь!
async_view
pdf_doc = export_pdf(request).getvalue() # .decode("windows-1252").encode("utf-8", 'ignore') would not raise an error but would be considered as plain text
email = mandrill.Mandrill(settings.MANDRILL_API_KEY)
email.messages.send_template(mandrill_template, [], {'to':[{'email':user.email}], 'subject':subject, 'text':message, attachments':[{'type':'application/pdf', 'name':'pdf file', 'content':pdf_doc}] })
# return HttpResponse(pdf_doc, mimetype='application/pdf') would return a well formatted pdf
функция export_pdf
def export_pdf(request):
html = render_to_string('pdf.html', { 'pagesize' : 'A4', }, context_instance=RequestContext(request,{
'text': text,
},))
result = cStringIO.StringIO()
pdf = pisa.pisaDocument(StringIO.StringIO(html), dest=result, encoding='UTF-8')
if not pdf.err:
return result
else:
return None
интересная часть трассировки
(...)
File "/home/raphael/Applications/Virtualenvs/apps/local/lib/python2.7/site-packages/mandrill.py", line 1476, in send_template
return self.master.call('messages/send-template', _params)
File "/home/raphael/Applications/Virtualenvs/apps/local/lib/python2.7/site-packages/mandrill.py", line 137, in call
params = json.dumps(params)
File "/home/raphael/Applications/Virtualenvs/apps/local/lib/python2.7/site-packages/simplejson/__init__.py", line 354, in dumps
return _default_encoder.encode(obj)
File "/home/raphael/Applications/Virtualenvs/apps/local/lib/python2.7/site-packages/simplejson/encoder.py", line 262, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/home/raphael/Applications/Virtualenvs/apps/local/lib/python2.7/site-packages/simplejson/encoder.py", line 340, in iterencode
return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x93 in position 11: invalid start byte
1 ответ
Нашел решение: кажется, PDF-документ должен быть в кодировке base64. Редактирование асинхронного представления так работает:
import base64
result = export_pdf(request)
encoded = base64.b64encode(result.getvalue())
email = mandrill.Mandrill(settings.MANDRILL_API_KEY)
email.messages.send_template(mandrill_template, [], {'to':[{'email':user.email}], 'subject':subject, 'text':message, attachments':[{'type':'application/pdf', 'name':'pdf file', 'content':encoded}] })