如何跳过处理电子邮件的附件,该电子邮件是不同电子邮件的附件

时间:2008-11-26 06:20:41

标签: python email jython attachment

使用jython

我的情况是电子邮件带有不同的附件。某些文件类型我处理其他我忽略的文件并且不写入文件。 我陷入了相当恶劣的境地,因为有时人们会发送电子邮件作为附件,而附加的电子邮件也有合法的附件。

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

使用python / jythons std email lib我该怎么做?


使其更清晰

我需要解析一封电子邮件(名为ROOT电子邮件),我想使用jython从这封电子邮件中获取附件。 接下来支持某些附件,即.pdf .doc等 现在只是碰巧,客户发送一封电子邮件(ROOT电子邮件),其中包含另一封电子邮件(CHILD电子邮件)作为附件,而在CHILD电子邮件中,它有.pdf附件等。

我需要的是:删除附在ROOT电子邮件和CHILD电子邮件附件中的任何CHILD电子邮件。发生的事情是我遍历整个电子邮件,它只是解析每个附件,BOTH ROOT附件和CHILD附件,就好像它们是ROOT附件一样。

我不能拥有这个。我只对合法的ROOT附件感兴趣,即.pdf .doc。 xls .rtf .tif .tiff

现在应该这样做,我必须跑去赶公共汽车! 谢谢!

4 个答案:

答案 0 :(得分:1)

现有建议的问题是walk方法。递归地,深度优先,遍历整个树,包括孩子。

查看walk方法的来源,并使其适应跳过递归部分。粗略阅读表明:

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

读取pydocs,get_payload应该返回一个顶级消息列表,而不是递归。

答案 1 :(得分:0)

名为“Here’s an example of how to unpack a MIME message like the one above, into a directory of files”的示例怎么样?它看起来很接近你想要的东西。

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())
    ...

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

我认为你想要的是mimetypes.guess_type()。使用这种方法也比只检查一些exentions要好得多。

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."

MIME types documentation