2010-05-07 114 views
7

我有一個django應用程序,它可以從HTML表單上的用戶輸入中動態生成PDF(使用reportlab + pypdf),並使用application/pdf MIMEType返回HTTP響應。動態生成PDF並使用django發送電子郵件

我想要做上述之間的選項,或發送電子郵件生成的PDF,但我不知道如何使用EmailMessage類的attach(filename=None, content=None, mimetype=None)方法。 documentation沒有給出太多描述什麼樣的對象content應該是。我試過一個文件對象和上面的application/pdf HTTP響應。

我目前有一個解決方法,我的視圖將PDF保存到磁盤,然後使用attach_file()方法將生成的文件附加到外發郵件。這對我來說似乎是錯誤的,我很確定有更好的方法。

回答

0

根據您link的例子:

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

難道你的PDF內容僅僅是因爲你通常會寫PDF文件相同的輸出?如果不想保存generated_pdf_data到myfile.pdf的,將其插入message.attach的內容領域:

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

我不知道如何將附着()函數將理解的格式生成PDF格式的數據。 – Shane 2010-05-07 15:55:42

+0

如果你打算真的把它寫出來,不妨使用attach_file()並保存open()行。這可能有助於「內存」附加。 http://two.pairlist.net/pipermail/reportlab-users/2009-April/008206.html – Lee 2010-05-08 16:16:50

6

好,我想通了。

attach()中的第二個參數需要一個字符串。我只是用一個文件對象的read()方法來生成,它正在尋找爲:

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

我結束了使用臨時文件代替,但概念是一樣的一個普通的文件對象。

+3

Reportlab和pyPdf都可以使用StringIO或cStringIO對象,因此您不必使用臨時文件。 – AKX 2010-05-07 19:23:09

4

生成文件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 

附上PDF到消息

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