【问题标题】:Create a ZipFile in memory and attach it to an email在内存中创建一个 ZipFile 并将其附加到电子邮件中
【发布时间】:2020-04-07 19:01:40
【问题描述】:

我正在尝试修改现有的 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 user's most upvoted answer 我可以通过对 zip 文件执行正常的open() 操作来修复我收到的read() takes at least 2 arguments 错误,但由于此文件是一个不起作用的缓冲流。

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

【问题讨论】:

    标签: python python-2.7 email-attachments zipfile in-memory


    【解决方案1】:

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

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

    csv_file.set_payload(buffer.getvalue())
    

    【讨论】:

    • 太棒了,谢谢!我知道有一个简单的答案,当然就是这样!
    猜你喜欢
    • 2017-02-08
    • 2011-12-31
    • 2021-09-02
    • 1970-01-01
    • 2023-03-22
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    相关资源
    最近更新 更多