python - 将文件作为附件发送 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()
解决方案
您可以同时读取和写入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()
推荐阅读
- python-3.x - 映射函数python3以获取消息长度
- ios - Swift 警告:应用程序委托收到对 -application:performFetchWithCompletionHandler 的调用:但从未调用过完成处理程序
- swift - 删除具有子值的父节点
- c++ - 在 C++ 中使用 libevdev 的设备输入事件
- java - ClassCastException:java.math.BigInteger 不能在 DriverManager.getConnection() 上转换为 java.lang.Long
- javascript - 尝试将静态 javascript 导入百里香
- javascript - vue.js :在需要该值的第二个 api 调用运行之前,变异状态变量尚未完成
- api - 如何提取 Google 服务帐户的令牌?
- reflection - Julia 反思是否提供内省和代祷?
- python - 在单个会话中从 python 运行 bash 命令