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