我正在编写一些将zip文件写入文件系统的代码,然后将该zip文件作为附件发送到电子邮件中。用于创建消息和附加文件的代码是:
msg = MIMEMultipart()
..
with open( filepath, 'r') as fin:
data = fin.read()
part = MIMEBase( 'application', 'octet-stream' )
part.set_payload( data )
Encoders.encode_base64( part )
part.add_header( 'Content-Disposition', 'attachment; filename="%s"' % filename )
msg.attach( part )
s = smtplib.SMTP( 'mailhost' )
s.sendmail( fromAddress, (toAddress,), msg.as_string() )
s.close()
在Linux下,一切正常,我可以打开附件。
在Windows下,zip文件正确写入文件系统,我可以打开,但尝试打开电子邮件中的zip附件失败,并显示损坏错误消息。
将csv文件(而不是zip文件)附加到电子邮件中可以在Linux和Linux中使用。视窗。
在Linux中解压缩附件提供:
Archive: fielname.zip
error [fielname.zip]: missing 8 bytes in zipfile
(attempting to process anyway)
retry - request = 0x18446744073709551608
error [fielname.zip]: attempt to seek before beginning of zipfile
(please check that you have transferred or created the zipfile in the
appropriate BINARY mode and that you have compiled UnZip properly)
(attempting to re-compensate)
extracting: filenmae.csv bad CRC 644faeb2 (should be b19cae37)
Windows上的Python版本是:2.6.6(r266:84297,2010年8月24日,18:46:32)[MSC v.1500 32位(英特尔)]
在linux上是:2.6.5(r265:79063,2010年3月26日,10:45:18)\ n [GCC 4.4.3]
我认为编码存在问题,但不确定从哪里开始查看。
答案 0 :(得分:1)
在Windows上,可以以文本模式或二进制模式打开文件。在文本模式中,可以执行不同种类的行分隔符之间的自动转换(例如\r\n
到\n
,反之亦然。这将损坏二进制文件,因此您可以通过以二进制模式打开二进制文件来避免它。
这一行:
with open( filepath, 'r') as fin:
需要:
with open( filepath, 'rb') as fin: