Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何跳过处理不同电子邮件附件的电子邮件附件_Python_Email_Jython_Attachment - Fatal编程技术网

Python 如何跳过处理不同电子邮件附件的电子邮件附件

Python 如何跳过处理不同电子邮件附件的电子邮件附件,python,email,jython,attachment,Python,Email,Jython,Attachment,使用jython 我遇到过这样的情况,电子邮件带有不同的附件。我处理的某些文件类型,我忽略的其他文件类型,不写入文件。 我陷入了一个相当糟糕的境地,因为有时人们会将电子邮件作为附件发送,而附件中的电子邮件有合法的附件 我想做的是跳过附加的电子邮件及其所有附件 使用python/jythons std电子邮件库如何做到这一点 更清楚地说 我需要解析一封电子邮件(名为ROOT email),我想使用jython从这封电子邮件中获取附件。 接下来,支持某些附件,如ie.pdf.doc等 现在碰巧的是

使用jython

我遇到过这样的情况,电子邮件带有不同的附件。我处理的某些文件类型,我忽略的其他文件类型,不写入文件。 我陷入了一个相当糟糕的境地,因为有时人们会将电子邮件作为附件发送,而附件中的电子邮件有合法的附件

我想做的是跳过附加的电子邮件及其所有附件

使用python/jythons std电子邮件库如何做到这一点


更清楚地说

我需要解析一封电子邮件(名为ROOT email),我想使用jython从这封电子邮件中获取附件。 接下来,支持某些附件,如ie.pdf.doc等 现在碰巧的是,客户端发送一封电子邮件(根电子邮件)和另一封电子邮件(子电子邮件)作为附件,在子电子邮件中有.pdf附件等等

我需要的是:摆脱任何附加到根电子邮件和子电子邮件附件的子电子邮件。我浏览了整个电子邮件,它只是解析每个附件,包括根附件和子附件,就像它们是根附件一样

我不能要这个。我只对合法的根附件感兴趣,例如.pdf.doc。xls.rtf.tif.tiff

现在就应该这样了,我得跑去赶公共汽车!
谢谢

名为“”的示例如何?它看起来和你想要的很接近

import email
...
msg = email.message_from_file(fp)
...
for part in msg.walk():
    # multipart/* are just containers
    if part.get_content_maintype() == 'multipart':
        continue
    # Applications should really sanitize the given filename so that an
    # email message can't be used to overwrite important files
    filename = part.get_filename()
    if not filename:
        ext = mimetypes.guess_extension(part.get_content_type())
    ...

您是否尝试过get_payload([i[,decode]])方法?与walk不同,它没有递归打开附件的文档。

我理解您的问题是“我必须检查电子邮件的所有附件,但如果附件也是电子邮件,我希望忽略它。”无论哪种方式,这个答案都应该引导您走上正确的道路

我想你想要的是
mimetypes.guess\u type()
。使用这种方法也比只检查一系列的注释要好得多

def check(self, msg):
    import mimetypes

    for part in msg.walk():
        if part.get_filename() is not None:
            filenames = [n for n in part.getaltnames() if n]
            for filename in filenames:
                type, enc = mimetypes.guess_type(filename)
                if type.startswith('message'):
                    print "This is an email and I want to ignore it."
                else:
                    print "I want to keep looking at this file."
请注意,如果仍在查看附加的电子邮件,请将其更改为:

def check(self, msg):
    import mimetypes

    for part in msg.walk():
        filename = part.get_filename()
        if filename is not None:
            type, enc = mimetypes.guess_type(filename)
            if type.startswith('message'):
                print "This is an email and I want to ignore it."
            else:
                part_filenames = [n for n in part.getaltnames() if n]
                for part_filename in part_filenames:
                    print "I want to keep looking at this file."

现有建议的问题是步行法。这个递归的深度优先遍历整个树,包括子树

查看walk方法的源代码,并调整它以跳过递归部分。粗略的阅读表明:

if msg.is_multipart():
    for part in msg.get_payload():
          """ Process message, but do not recurse """
          filename = part.get_filename()

阅读pydocs,get_payload应该会返回顶级消息列表,而不会递归。

这不是很清楚,我当然希望编辑问题,并提供更多细节和示例……我编辑了您的问题标题。我希望它仍能传达原意。Sergio这几乎是准确的,除了我已经可以做到这一点,我想知道的是,我如何不处理电子邮件的附件,这是另一封电子邮件的附件。哦,是的,我试过了,但uess_扩展返回了不可靠的输出,而且walk似乎遍历了每个部分,我只想在邮件的根部分。有点像在根目录中获取文件,而不是在根文件夹的目录中获取文件。