首页 > 解决方案 > 将文件作为附件发送 Django

问题描述

我创建了一个 XLS 文件并希望将其作为电子邮件的附件发送。以下代码运行良好,我收到一封包含 XLS 文件的电子邮件(状态代码为 200 OK)。

# This is working code
import xlwt
import StringIO
import zipfile

from django.core.mail import EmailMessage


work_book = xlwt.Workbook()

# Here some boring stuff with excel
...

report_name = "do_something_%(username)s_%(current_date)s.xls"

f = StringIO.StringIO()
work_book.save(f)

message = EmailMessage(
    subject=u"Sample Title",
    body=u"Sample body",
    to=["test@company.com"])

message.attach(report_name, f.getvalue())
message.send()

但是,如果我尝试发送压缩的 XLS 文件(使用 zipfile),我什么也收不到(但是状态码是“200 OK”)。我用以下代码替换了最后两行代码:


report_name_zip = 'do_something_%(username)s_%(current_date)s.zip'

with zipfile.ZipFile(f, mode='w', compression=zipfile.ZIP_DEFLATED) as zf:
    zf.writestr(zinfo_or_arcname=report_name, bytes=f.getvalue())

message.attach(report_name_zip, f.getvalue())
message.send()

标签: pythondjangodjango-1.11

解决方案


您可以同时读取和写入stringIO. 您应该使用两个单独StringIO的 s:

report_name_zip = 'do_something_%(username)s_%(current_date)s.zip'

report_name = "do_something_%(username)s_%(current_date)s.xls"

f1 = StringIO.StringIO()
work_book.save(f1)

f2 = StringIO.StringIO()
with zipfile.ZipFile(f2, mode='w', compression=zipfile.ZIP_DEFLATED) as zf:
    zf.writestr(zinfo_or_arcname=report_name, data=f1.getvalue())

message.attach(report_name_zip, f2.getvalue())
message.send()

推荐阅读