使用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
现在应该这样做,我必须跑去赶公共汽车! 谢谢!
答案 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."