如何在Django中将pdf作为电子邮件附件发送

Posted

技术标签:

【中文标题】如何在Django中将pdf作为电子邮件附件发送【英文标题】:How to send pdf as an email attachment in Django 【发布时间】:2014-01-10 03:13:57 【问题描述】:

您好,我正在使用以下 2 个功能通过邮件即时创建和发送 pdf。我究竟做错了什么。 (在浏览器中显示时导出pdf功能正常。)

我得到的错误是 “TypeError: 'ContentFile' 对象不支持索引”。我做错了什么?几乎所有这些代码都取自一些博客,所以我不知道它是如何工作的。但如果您不明白某些事情,请发表评论。我会回复的。

 if request.method=="POST":

    form = ReportSendMailForm(request.POST)

    if form.is_valid():

        email = form.cleaned_data['mail']
        message = form.cleaned_data['message']             
        print email
        print message
        result = export_pdf(request,id)
        file_to_be_sent= ContentFile(result)
        #print file_to_be_sent
        if result:
            #try :

                subject, from_email, to =  request.user.username+' has sent a report for review',' Dtz Team', email                   
                html_content = render_to_string('email/report.html','username':request.user,'messgae':message)                         
                msg = EmailMultiAlternatives(subject,'', from_email, [to])

                msg.attach_alternative(html_content, "text/html")
                msg.attach("Report.pdf", file_to_be_sent, "application/pdf")

                msg.send()  
                messages.success(request,'Please check your email id '+email+' for further instructions.')  
                return HttpResponse('success')         
            #except:
            #           pass             
messages.error(request,'Error occured in the pdf.')            
return HttpResponse(status=410)  

导出PDF功能

def export_pdf(request,id):
    report = Report.objects.get(id=id)                
    options1 = ReportPropertyOption.objects.filter(report=report,is_active=True)
    for option in options1:
        option.exterior_images = ReportExteriorImages.objects.filter(report = option)  
        option.interior_images = ReportInteriorImages.objects.filter(report = option)
        option.floorplan_images = ReportFloorPlanImages.objects.filter(report = option)
        option.fitouts =    ReportFitOut.objects.filter(propertyoption = option)   
        if (option.gps_longitude):
            option.map = "http://maps.google.com/maps/api/staticmap?zoom=12&size=400x400&maptype=roadmap&sensor=false&center=\""+str(option.gps_latidtude)+","+str(option.gps_longitude)+"\""                 

    html  = render_to_string('report/export.html',  'pagesize' : 'A4', , context_instance=RequestContext(request,'options1':options1,'meta':report.meta))
    result = StringIO.StringIO()       
    pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), dest=result, link_callback=fetch_resources )
    if not pdf.err:
        return result
    else:
        return None

【问题讨论】:

【参考方案1】:

你不应该使用django.core.files.ContentFile,它只接受字符串。

file_to_be_sent= export_pdf(request,id).getvalue() # if it's not None
msg.attach("Report.pdf", file_to_be_sent, "application/pdf")

【讨论】:

这真是又快又准。非常感谢 :) 并且工作得很好。

以上是关于如何在Django中将pdf作为电子邮件附件发送的主要内容,如果未能解决你的问题,请参考以下文章

使用 django 通过模板管理 pdf 并作为电子邮件附件发送

如何使用exchangelib在python中将熊猫数据框作为电子邮件附件发送

在批准报价、运行报告、生成 PDF 并发送带有 PDF 作为附件的电子邮件

在java中将电子邮件作为附件发送

创建 PDF 并使用烧瓶邮件作为附件发送

Python/Django - 我可以创建多个类似 pdf 文件的对象,将它们压缩并作为附件发送吗?