Python 解压电子邮件csv

Python 解压电子邮件csv,python,python-3.x,email,Python,Python 3.x,Email,我正在迁移一个接收电子邮件并提取zip文件附件的应用程序。这在python2中工作,看起来像: import email from StringIO import StringIO from zipfile import ZipFile def get_email_csv(mail): payload = None if mail.is_multipart(): for part in mail.walk(): if part.get_c

我正在迁移一个接收电子邮件并提取zip文件附件的应用程序。这在python2中工作,看起来像:

import email
from StringIO import StringIO
from zipfile import ZipFile

def get_email_csv(mail):
    payload = None
    if mail.is_multipart():
        for part in mail.walk():
            if part.get_content_maintype() != 'multipart' and 
               part.get('Content-Disposition') is not None and 
               'attachment' in part.get('Content-Disposition'):              
                payload = part.get_payload(decode=True)
                break
    if payload is not None:
        content = StringIO(payload)
        input_zip=ZipFile(content)
        for name in input_zip.namelist():
             unzipped = input_zip.read(name)
        return unzipped

但是,我在将其迁移到python3时遇到了一个问题。以下是我的代码:

import email
from io import StringIO
from zipfile import ZipFile

def get_email_csv(mail):
    payload = None
    if mail.is_multipart():
        for part in mail.walk():
            if part.get_content_maintype() != 'multipart' and 
               part.get('Content-Disposition') is not None and 
               'attachment' in part.get('Content-Disposition'):              
                payload = part.get_payload(decode=True)
                break
    if payload is not None:
        content = StringIO(payload.decode('latin1'))
        input_zip=ZipFile(content)
        for name in input_zip.namelist():
             unzipped = input_zip.read(name)
        return unzipped

这似乎导致异常
zipfile.BadZipFile:文件不是zip文件
。除了在python3中解码有效负载,我还需要做更多的工作吗?我还需要做一些其他的区别/步骤。

将二进制代码解码为Unicode是错误的。您需要实际的
字节
(因此
字节

导入电子邮件
从io导入字节io#而不是字符串io
从zipfile导入zipfile
def get_电子邮件_csv(邮件):
有效载荷=无
如果mail.is_multipart():
对于mail.walk()中的part:#注意反斜杠语法修复了v
如果part.get_content_maintype()!='“多部分”和\
part.get('Content-Disposition')不是None和\
部分.get('Content-Disposition')中的“附件”:
有效载荷=部分。获取有效载荷(解码=真)
打破
如果有效负载不是无:
content=BytesIO(有效负载)#BytesIO->无解码()
input_zip=ZipFile(内容)
对于输入_zip.namelist()中的名称:
unzip=input\u zip.read(名称)
返回解压缩
我可能会拿出支票查看
内容处置:
;严格来说,这个标题不是必需的,有些客户端可能会忽略它。无论如何,二进制附件的默认配置是
'attachment'
(很难想象
'inline'
在这里是什么意思)