在 Django 中将 PDF 附加到电子邮件

17

我的应用程序使用django-wkhtmltopdf生成PDF报告。我希望能够将PDF附加到电子邮件并发送。

这是我的PDF视图:

class Report(DetailView):
    template = 'pdf_reports/report.html'
    model = Model

    def get(self, request, *args, **kwargs):
        self.context['model'] = self.get_object()

        response=PDFTemplateResponse(request=request,
                                     template=self.template,
                                     filename ="report.pdf",
                                     context=self.context,
                                     show_content_in_browser=False,
                                     cmd_options={'margin-top': 0,
                                                  'margin-left': 0,
                                                  'margin-right': 0}
                                     )
        return response

这是我的电子邮件视图:

def email_view(request, pk):
    model = Model.objects.get(pk=pk)
    email_to = model.email
    send_mail('Subject here', 'Here is the message.', 'from',
    [email_to], fail_silently=False)

    response = HttpResponse(content_type='text/plain')
    return redirect('dashboard')

请看这里如何在电子邮件中附加文件:https://dev59.com/Smkw5IYBdhLWcg3w8fFJ - Anentropic
那你当时做了什么?所选答案不是很清楚。 - Gourav Chawla
3个回答

16

文档中写道(https://docs.djangoproject.com/en/dev/topics/email/#the-emailmessage-class):

并非所有的EmailMessage类功能都可以通过send_email()函数及其相关封装函数使用。如果您想要使用高级功能,例如密送收件人、文件附件或多部分电子邮件,则需要直接创建EmailMessage实例。

因此,您需要创建一个EmailMessage实例:

from django.core.mail import EmailMessage

email = EmailMessage(
    'Subject here', 'Here is the message.', 'from@me.com', ['email@to.com'])
email.attach_file('Document.pdf')
email.send()

8
如果您想附加一个存储在内存中的文件,只需使用 attach 即可。
msg = EmailMultiAlternatives(mail_subject, text_content, settings.DEFAULT_FROM_EMAIL, [instance.email])
msg.attach_alternative(message, "text/html")
pdf = render_to_pdf('some_invoice.html')
msg.attach('invoice.pdf', pdf)
msg.send()

1
一个情景是文件被保存在磁盘上(例如在仓库中),并通过固定路径访问。使用模型中的字段更安全(也可能更容易)。假设PDF文件存储在某个model_instance对象的FileField中:
from django.core.mail import EmailMessage

pdf_file = model_instance.file  # <- here I am accessing the file attribute, which is a FileField
message = EmailMessage(
    "Subject",
    "Some body."
    "From@example.com",
    [email_to],
)
message.attach("document.pdf", pdf_file.read())
message.send(fail_silently=False) 

你可以使用PDFTemplateResponse的实例变量“res”,而不是使用'message.attach("document.pdf", pdf_file.read())'。使用'message.attach("document.pdf", res.rendered_content)',然后你就可以在不先将生成的PDF保存到文件系统中的情况下使用它了。 - loafer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接