在内存中创建一个 ZipFile 并将其附加到电子邮件中
Create a ZipFile in memory and attach it to an email
我正在尝试修改现有的 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
中,但我认为这也应该有效。
ZipFile
对象的 read
方法用于读取 zip 文件中命名文件的内容。
在使用 ZipFile
实例的 writestr
方法写入缓冲区后,您应该使用 buffer
的内容:
csv_file.set_payload(buffer.getvalue())
我正在尝试修改现有的 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
中,但我认为这也应该有效。
ZipFile
对象的 read
方法用于读取 zip 文件中命名文件的内容。
在使用 ZipFile
实例的 writestr
方法写入缓冲区后,您应该使用 buffer
的内容:
csv_file.set_payload(buffer.getvalue())