首页 > 解决方案 > 在内存中创建一个 ZipFile 并将其附加到电子邮件中

问题描述

我正在尝试修改现有的 python 脚本以将内存中的 CSV 转换为(也在内存中)zip 存档并将其作为电子邮件的附件发送。我已经成功地附加了一个内存中的 CSV 文件(通过 MIMEText 对象),但由于需要设置文件字节的有效负载,所以在使用 ZIP 文件(通过 MIMEBase 对象)时遇到了问题。

这是我到目前为止的代码:

csv_buffer = cStringIO.StringIO()
buffer = cStringIO.StringIO()

zf = zipfile.ZipFile(buffer,
               mode='w',
               compression=zipfile.ZIP_DEFLATED,
               )

zf.writestr(csvfile + ".csv", csv_buffer.getvalue())


csv_file = MIMEBase('application', 'zip')
csv_file.set_payload(zf.read())
encoders.encode_base64(csv_file)
csv_file.add_header('Content-Disposition', 'attachment',
         filename=csvfile + ".zip")

msg.attach(csv_file)

从this this user's most upvoted answer我可以通过对zip文件执行正常操作来修复read() takes at least 2 arguments我收到的错误,open()但由于这个文件是一个不起作用的缓冲流。

我不确定如何将zipfile对象加载到其中,set_payload但我认为这也应该有效。

标签: pythonpython-2.7email-attachmentszipfilein-memory

解决方案


对象的read方法ZipFile旨在读取 zip 文件中命名文件的内容。

在使用实例的方法buffer写入缓冲区后,您应该使用 的内容:writestrZipFile

csv_file.set_payload(buffer.getvalue())

推荐阅读