Django, ReportLab PDF Generation прилагается к электронной почте - PullRequest
8 голосов
/ 07 декабря 2010

Как лучше всего использовать 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 = []

... сделать мой PDF, добавив таблицы в документ ...

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

Я просто не уверен, как перевести мой pdf-документ в виде большого двоичного объекта, чтобы email.attach мог принять его, а email.send мог его отправить.

Есть идеи?

Ответы [ 3 ]

8 голосов
/ 09 декабря 2010

Использование 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()

Отлично работает !!

5 голосов
/ 09 декабря 2010

ОК - я понял это на основе объединения нескольких вещей -

Прежде всего - мои требования: - Я только хотел создать PDF-файлы в памяти - я не хочу, чтобы файлы зависали, поскольку они занимают место, и я не хочу, чтобы какие-то конфиденциальные данные оставались без защиты на сервере.

Итак - я выбрал функции ReportLab и Platypus для генерации моих документов. Я потратил на это достаточно времени, это легко. Итак, вот мой подход, который позволяет мне использовать DocTempates в ReportLab, позволяет мне использовать возможности электронной почты 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()

Моя проблема от перехода от веб-генерации к генерации электронной почты заключалась в получении нужного объекта, который можно «прикрепить» к электронной почте. Создание буфера, затем захват данных из буфера сделали это для меня ...

3 голосов
/ 07 декабря 2010

Я не вижу, где отображается ваш BLOB-объект, поэтому я не могу посоветовать вам, как его импортировать.Я получил отличные результаты, используя Pisa и StringIO:

import ho.pisa as pisa
import StringIO
from django.template.loader import render_to_string
from django.core.mail import EmailMessage

render = render_to_string("books/agreement/agreement_base.html",
                              { "title": book.title,
                                "distribution": book.distribution_region })
out = StringIO.StringIO()
pdf = pisa.CreatePDF(StringIO.StringIO(render), out)
email = EmailMessage('Hello', 'Body', 'from@from.com', ['to@to.com'])
email.attach('agreement.pdf', out.getvalue(), 'application/pdf')
email.send()

Тем не менее, если ваш PDF существует как независимый и постоянный документ в вашей файловой системе, не могли бы вы просто:

email.attach('agreement.pdf', open('agreement.pdf', 'rb').read(), 'application/pdf')
...