Динамически генерируйте PDF и отправляйте его по электронной почте, используя django - PullRequest
8 голосов
/ 07 мая 2010

У меня есть приложение django, которое динамически генерирует PDF (используя reportlab + pypdf) из пользовательского ввода в форме HTML и возвращает ответ HTTP с application/pdf MIMEType.

Я хочу, чтобы у меня был выбор между выполнением вышеизложенного или отправкой по электронной почте сгенерированного файла PDF, но я не могу понять, как использовать метод класса attach(filename=None, content=None, mimetype=None) класса EmailMessage. Документация не дает подробного описания того, каким объектом content должен быть. Я пробовал объект файла и приведенный выше application/pdf HTTP-ответ.

В настоящее время у меня есть обходной путь, при котором мое представление сохраняет pdf на диск, а затем я присоединяю полученный файл к исходящему письму, используя метод attach_file(). Мне это кажется неправильным, и я уверен, что есть лучший способ.

Ответы [ 3 ]

6 голосов
/ 07 мая 2010

Хорошо, я понял это.

Второй аргумент в attach() ожидает строку. Я просто использовал метод read() объекта файла, чтобы сгенерировать то, что он искал:

from django.core.mail import EmailMessage

message = EmailMessage('Hello', 'Body goes here', 'from@example.com',
    ['to1@example.com', 'to2@example.com'], ['bcc@example.com'],
    headers = {'Reply-To': 'another@example.com'})
attachment = open('myfile.pdf', 'rb')
message.attach('myfile.pdf',attachment.read(),'application/pdf')

Вместо этого я использовал временный файл, но концепция та же, что и у обычного файлового объекта.

4 голосов
/ 21 марта 2016

Создать файл 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@gmail.com"])
    msg.attach('my_pdf.pdf', pdf, 'application/pdf')
    msg.content_subtype = "html"
    msg.send()
0 голосов
/ 07 мая 2010

Исходя из примера в вашей ссылке :

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

Разве ваш контент для pdf не будет тем же выводом, который вы обычно пишете в файл pdf?Вместо того, чтобы сохранять сгенерированные_pdf_data в myfile.pdf, вставьте его в поле содержимого message.attach:

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