Django,ReportLab PDF生成附加到电子邮件

Dan*_*l D 8 email django reportlab

使用Django和ReportLab生成PDF并将其附加到电子邮件消息的最佳方法是什么?

我正在使用SimpleDocTemplate并且可以将生成的PDF附加到我的HttpResponse - 这很棒,但是我无法找到如何将相同的附件添加到电子邮件中:

    # Create the HttpResponse object with the appropriate PDF headers.
    response = HttpResponse(mimetype='application/pdf')
    response['Content-Disposition'] = 'attachment; filename=invoice.pdf'
    doc = SimpleDocTemplate(response, pagesize=letter)
    Document = []
Run Code Online (Sandbox Code Playgroud)

...通过将表附加到文档来制作我的pdf ...

  doc.build(Document)
  email = EmailMessage('Hello', 'Body', 'from@from.com', ['to@to.com'])
  email.attach('invoice.pdf', ???, 'application/pdf')
  email.send()
Run Code Online (Sandbox Code Playgroud)

我只是不确定如何将我的pdfdocument翻译为blob,以便email.attach可以接受它并且email.send可以发送它.

有任何想法吗?

mag*_*can 8

使用ReportLab


try:
    from cStringIO import StringIO
except ImportError:
    from StringIO import StringIO
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter, A4
from reportlab.lib.units import inch

def createPDF(request):
 x=100
 y=100
 buffer=StringIO()
 p=canvas.Canvas(buffer,pagesize=letter)
 p.drawString(x,y,"HELLOWORLD")
 p.showPage()
 p.save() 
 pdf=buffer.getvalue()
 buffer.close() 
 return pdf

def someView(request):
 EmailMsg=mail.EmailMessage(YourSubject,YourEmailBodyCopy,'email@email.com',["email@email.com"],headers={'Reply-To':'email@email.com'})
 pdf=createPDF(request)
 EmailMsg.attach('yourChoosenFileName.pdf',pdf,'application/pdf')
 EmailMsg.send()
Run Code Online (Sandbox Code Playgroud)

完美的工作!


Dan*_*l D 5

好的-我是根据一些东西拼凑而成的-

首先-我的要求:-我只想在内存中创建PDF-我不希望文件在周围徘徊,因为它们占用了空间,我也不希望敏感数据在服务器上不受保护地徘徊。

所以-我选择了ReportLab和Platypus功能来生成我的文档。我现在已经投入了足够的时间,这很容易。因此,这是让我使用ReportLab中的DocTempates的方法,允许我使用Django的电子邮件功能来发送电子邮件。

这是我的做法:

 # Create the PDF object, using the buffer object as its "file."
  buffer = StringIO()
  doc = SimpleDocTemplate(buffer, pagesize=letter)
  Document = []

  # CRUFT PDF Data

  doc.build(Document)
  pdf = buffer.getvalue()
  buffer.close()

  email = EmailMessage('Hello', 'Body', 'from@from.com', ['to@to.com'])
  email.attach('invoicex.pdf', pdf , 'application/pdf')
  email.send()
Run Code Online (Sandbox Code Playgroud)

我从网络生成转向电子邮件生成的问题是找到了可以“附加”到电子邮件的正确对象。创建一个缓冲区,然后从缓冲区中获取数据对我来说是成功的...