2014-04-28 7 views
2

을 편집하십시오. 해결책을 찾았습니다. pdf 문서가 base64로 인코딩되어 있어야합니다. 등의 작품으로 비동기보기 편집 : 편집Django Mandrill 전자 메일 인코딩

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/피사로 만든 PDF 문서를 보내는 데 문제가 있습니다. 로 응용 프로그램 작업은 다음하십시오 content_view가

  1. 가 (AN export_pdf 함수를 호출하여) PDF를 생성하고 async_view
  2. 호출 첨부하여 이메일을 송신한다.

PDF 문서는 유효 (I 대신 보내기의 async_viewHttpResponse에 PDF 파일을 수정하면, 내가 유효한 PDF 문서를 참조) 보인다. 는하지만, 드릴로 전송하면 인코딩 오류를 반환

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

내가 여기 (Python: Sanitize a string for unicode?) 했나요으로 해결하기 위해 노력했다. 이 경우 오류는 더 이상 발생하지 않지만 전자 메일 첨부 파일은 '텍스트/일반'으로 간주되어 읽을 수 없습니다. 도움을 주셔서 감사합니다.

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 
+0

, 그것은 답변으로 게시과 이용 약관을 읽고 동의를하는 것이 가장 좋습니다. 이렇게하면 질문에 답변으로 표시되고 다른 유사한 질문이 나타나면 나중에 참조 할 수 있습니다. – Lav

+0

감사합니다 Lav! – Raphael

답변

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