#!/usr/bin/python
import os
import sys
import email
import getopt
def usage():
print '''Help Information:
-i: eml file you want to decode
-d: path where you want to echo
-h: help'''
def main():
if sys.argv[1:]==[]:
sys.argv[1:]=['-h']
opts,args=getopt.getopt(sys.argv[1:], 'i:d:h')
for o, k in opts:
if o=='-h':
usage()
sys.exit()
if o=='-i':
msgfile=k
if o=='-d':
loc_path=k
if 'loc_path' not in locals():
loc_path='./'
fp = open(msgfile)
msg = email.message_from_file(fp)
fp.close()
counter = 1
for part in msg.walk():
if part.get_content_maintype() == 'multipart':
continue
filename = part.get_filename()
if not filename:
continue
counter += 1
fp = open(os.path.join(loc_path, filename), 'wb')
fp.write(part.get_payload(decode=True))
fp.close()
if __name__ == '__main__':
main()
原始脚本是这样的,但是这段代码有一个bug。所剥离的附件不一定是原文件名。例如附件前面有一个空格。则这个程序会把空格清除掉。
以上的脚本并没有错。问题在于python的 email模块的中 get_filename() 函数存有BUG。是python语言这个版本自身存在的问题。
同一个邮件文件,使用 ripmime -i 和 使用这个脚本 得出来的附件名称有出处。
在python命令行下:
import email
fp=open('sample.eml')
msg=email.message_from_file(fp)
for part in msg.walk():
filename=part.get_filename()
print filename
得到的结果文件前面的空格被剔除掉了。如果有兴趣的同学可以尝试一下, Python 2.7 是否存在这样的BUG。