2010-05-07 6 views
7

Tôi có ứng dụng django tự động tạo tệp PDF (sử dụng reportlab + pypdf) từ đầu vào của người dùng trên biểu mẫu HTML và trả về phản hồi HTTP bằng MIMEType application/pdf.Tự động tạo PDF và gửi email bằng django

Tôi muốn có tùy chọn giữa thực hiện ở trên hoặc gửi email bản pdf được tạo, nhưng tôi không thể tìm ra cách sử dụng phương thức attach(filename=None, content=None, mimetype=None) của lớp EmailMessage. Các documentation không cung cấp cho nhiều mô tả về loại đối tượng content được cho là. Tôi đã thử một đối tượng tệp và phản hồi HTTP ở trên application/pdf.

Tôi hiện đang giải quyết khi chế độ xem của tôi lưu tệp pdf vào đĩa và sau đó tôi đính kèm tệp kết quả vào email gửi đi bằng phương thức attach_file(). Điều này có vẻ sai với tôi, và tôi khá chắc chắn có một cách tốt hơn.

Trả lời

0

Dựa trên ví dụ trong link của bạn:

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

Sẽ không nội dung của bạn cho một pdf chỉ được đầu ra tương tự mà bạn thường sẽ ghi vào tập tin pdf? Thay vì lưu tệp created_pdf_data vào myfile.pdf, hãy cắm nó vào trường nội dung của message.attach:

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

Tôi không chắc chắn làm thế nào để tạo ra các dữ liệu pdf trong một định dạng mà các đính kèm() chức năng sẽ hiểu. – Shane

+0

Nếu bạn thực sự sẽ ghi nó ra tệp, có thể sử dụng attach_file() và lưu dòng mở(). Điều này có thể giúp gắn thẻ 'trong bộ nhớ'. http://two.pairlist.net/pipermail/reportlab-users/2009-April/008206.html – Lee

6

Ok tôi đã tìm ra.

Đối số thứ hai trong attach() mong đợi một chuỗi. Tôi chỉ sử dụng phương pháp một đối tượng tập tin của read() để tạo ra những gì nó đang tìm kiếm:

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

tôi đã kết thúc bằng một tempfile thay vào đó, nhưng khái niệm này cũng giống như một đối tượng tập tin bình thường.

+3

Reportlab và pyPdf đều có thể sử dụng các đối tượng StringIO hoặc cStringIO, vì vậy bạn sẽ không phải sử dụng các tệp tạm thời. – AKX

4

Tạo tạm thời tệp.

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 

Gắn PDF sang nhắ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()