2010-05-07 21 views
7

Bir HTML formunda kullanıcı girdisinden dinamik olarak bir PDF (reportlab + kullanarak) oluşturan bir django uygulamasına sahibim ve bir application/pdf MIMEType ile HTTP yanıtını döndürür.PDF'yi dinamik olarak oluşturun ve django kullanarak e-posta gönderin

Yukarıdakileri yapma veya oluşturulan pdf'yi gönderme seçeneğine sahip olmak istiyorum, ancak EmailMessage sınıfının attach(filename=None, content=None, mimetype=None) yöntemini nasıl kullanacağımı anlayamıyorum. documentation, ne tür bir nesne content olması gerektiği ile ilgili bir açıklama vermez. Bir dosya nesnesi ve yukarıdaki application/pdf HTTP yanıtını denedim.

Şu anda görünümümün bir pdf'yi diske kaydettiği bir geçici çözümüm var ve sonuçta ortaya çıkan dosyayı attach_file() yöntemini kullanarak giden bir e-postaya ekliyorum. Bu bana yanlış geliyor, ve eminim ki daha iyi bir yol var.

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

pdf için içerik sadece normalde pdf dosyasına yazardı aynı çıktıyı olmaz: En link örnek dayanarak

cevap

0

? Bunun yerine myfile.pdf için generated_pdf_data kaydetme, message.attach content alanında takın: Ben çözdüm Tamam

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

PDF takın. – Shane

+0

Aslında dosyaya yazacaksanız, yine de attach_file() öğesini kullanabilir ve open() hattını kaydedebilirsiniz. Bu 'bellekte' eklemeye yardımcı olabilir. http://two.pairlist.net/pipermail/reportlab-users/2009-April/008206.html – Lee

6

.

attach() ikinci argüman bir dize bekliyor. Sadece aradığımı oluşturmak için bir dosya nesnesinin read() yöntemini kullandı:

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') 

onun yerine bir tempfile kullanarak sona erdi, ancak kavram sıradan bir dosya nesnesi olarak aynıdır.

+3

Reportlab ve geçici dosyaları kullanmak zorunda kalmazsınız, StringIO veya cStringIO nesnelerini kullanabilir hem pyPdf. – AKX

4

Dosya temp.

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 

I() işlevi anlayacak takmak bir biçimde pdf verilerini oluşturmak için nasıl emin değilim mesajın

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() 
İlgili konular