Django Mandrill 邮件编码

2 投票
1 回答
1291 浏览
提问于 2025-04-18 04:36

编辑。找到了解决办法:看起来这个pdf文档需要进行base64编码。按照这样的方式修改async视图就可以了:

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}] })

编辑结束

我在使用xhtml2pdf/pisa创建pdf文档并作为附件发送到Mandrill时遇到了问题。这个应用程序的工作流程是这样的:一个content_view调用一个async_view,这个视图

  1. 生成pdf(通过调用export_pdf函数)并且
  2. 发送带有附件的邮件。

这个pdf文档看起来是有效的(如果我把async_view改成HttpResponse来直接显示pdf,而不是发送它,我能看到一个有效的pdf文档)。但是发送到Mandrill时却返回了编码错误:

UnicodeDecodeError: 'utf8' codec can't decode byte 0x93 in position 11: invalid start byte.

我尝试按照这里提到的方法解决这个问题(Python: 清理字符串以适应unicode?)。在这种情况下,不再出现错误,但我收到的pdf作为邮件附件被认为是'text/plain',无法读取。谢谢你的帮助!

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 个回答

2

找到了解决办法:看起来这个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}] })

撰写回答