2010-05-07 35 views
7

Tengo una aplicación django que genera dinámicamente un PDF (utilizando reportlab + pypdf) de la entrada del usuario en un formulario HTML y devuelve la respuesta HTTP con un application/pdf MIMEType.Genere PDF de forma dinámica y envíelo por correo electrónico usando django

Quiero tener la opción entre hacer lo anterior o enviar por correo electrónico el pdf generado, pero no puedo entender cómo usar el método attach(filename=None, content=None, mimetype=None) de la clase EmailMessage. El documentation no da mucha descripción de qué tipo de objeto se supone que es content. Probé un objeto de archivo y la respuesta HTTP application/pdf anterior.

Actualmente tengo una solución alternativa donde mi vista guarda un pdf en el disco, y luego adjunto el archivo resultante a un correo electrónico saliente utilizando el método attach_file(). Esto me parece incorrecto, y estoy bastante seguro de que hay una mejor manera.

Respuesta

0

Basado en el ejemplo en tu link:

message.attach('design.png', img_data, 'image/png') 

No sería su contenido para un pdf ser la misma salida que normalmente escribir en el fichero PDF? En lugar de guardar los generated_pdf_data a myfile.pdf, conectarlo en el campo de contenido del message.attach:

message.attach('myfile.pdf', generated_pdf_data, 'application/pdf') 
+0

No estoy seguro de cómo generar los datos PDF en un formato que el pegado de función() lo entendería. – Shane

+0

Si de todos modos va a escribirlo en el archivo, también podría usar attach_file() y guardar la línea open(). Esto podría ayudar con la conexión 'en memoria'. http://two.pairlist.net/pipermail/reportlab-users/2009-April/008206.html – Lee

6

Ok He descubierto.

El segundo argumento en attach() espera una cadena. Acabo de utilizar el método de un objeto de archivo read() para generar lo que buscaba:

from django.core.mail import EmailMessage 

message = EmailMessage('Hello', 'Body goes here', '[email protected]', 
    ['[email protected]', '[email protected]'], ['[email protected]'], 
    headers = {'Reply-To': '[email protected]'}) 
attachment = open('myfile.pdf', 'rb') 
message.attach('myfile.pdf',attachment.read(),'application/pdf') 

Terminé usando un archivo temporal en su lugar, pero el concepto es el mismo que un objeto archivo ordinario.

+3

Reportlab y pyPdf pueden usar objetos StringIO o cStringIO, por lo que no tendrá que usar archivos temporales. – AKX

4

Generar la temperatura del archivo.

from django.utils import timezone  
from io import BytesIO 
from reportlab.pdfgen import canvas 
from reportlab.lib.pagesizes import letter 

def generate_pdf(pk): 
    y = 700 
    buffer = BytesIO() 
    p = canvas.Canvas(buffer, pagesize=letter) 
    p.setFont('Helvetica', 10) 
    p.drawString(220, y, "PDF generate at "+timezone.now().strftime('%Y-%b-%d')) 
    p.showPage() 
    p.save() 
    pdf = buffer.getvalue() 
    buffer.close() 
    return pdf 

Acople el PDF con el mensaje

from django.core.mail import EmailMessage 
def send(request) 
    pdf = generate_pdf(pk) 
    msg = EmailMessage("title", "content", to=["[email protected]"]) 
    msg.attach('my_pdf.pdf', pdf, 'application/pdf') 
    msg.content_subtype = "html" 
    msg.send() 
Cuestiones relacionadas