2017-03-17 75 views
0

我试图从.msg文件中提取附件。 github上的解决方案太详细了,我不能正确理解,这里的答案并不尽如人意。在另一个类似于我的问题中指出了这个example,但我一直无法弄清楚这个函数是如何工作的。
我相信我接近,但无法弄清楚它是什么我768,16与开幕 - 开放(msgFile)为FP:这是我到目前为止的代码:19.1.14电子邮件:示例 - 第5个示例的问题

import os 
import sys 
import email 
import errno 
import mimetypes 

from argparse import ArgumentParser 

def main(): 
    parser = ArgumentParser(description = """\ 
Unpack a MIME message into a directory of files. 
""") 
    parser.add_argument('-d', '-- C:\\Users\\MikeS\\Documents\\ImproveBKFS\\Python\\msg_extract', required = True, 
        help = """Unpack the MIME message into the named 
        directory, which will be created if it doesn't already 
        exist.""") 
parser.add_argument('TestFile.msg') 
args = parser.parse_args() 

with open(args, 'wb') as fp: #issues with open(args) 
    msg = email.message_from_file(fp) 

try: 
    os.mkdir(args.directory) 
except FileExistsError: 
    pass 

counter = 1 
for part in msg.walk(): 
#multipar/* 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()) 
     if not ext: 
      #Use a generic bag-of-bit extension 
      ext = '.bin' 
     filename = 'part-%03d%' % (counter, ext) 
    counter +=1 
    with open(os.path.join(arg.directory, filename), 'wb') as fp: 
     fp.write(part.get_payload(decode=True)) 

if __name__ == '__main__': 
    main() 

我被困第20行这里是我的输入和错误消息。

PS C:\Users\MikeS\Documents\\Python\msg_extract> py -3  get_payload_3.py -d ^V TestFile.msg 
Namespace(C:\Users\MikeS\Documents\Python\msg_extract='\x16', TestFile.msg='TestFile.msg') 
Traceback (most recent call last): 
    File "get_payload_3.py", line 53, in <module> 
    main() 
    File "get_payload_3.py", line 26, in main 
    with open(args) as fp: #something with this line 
TypeError: invalid file:  Namespace(C:\Users\MikeS\Documents\Python\msg_extract='\x16',  TestFile.msg='Test 
File.msg') 

任何输入或输入类型的线索我需要给这个函数将是一个巨大的帮助。谢谢

回答

0
parser.add_argument('-d', '-- C:\\Users\\MikeS\\Documents\\ImproveBKFS\\Python\\msg_extract', required = True, 
       help = """Unpack the MIME message into the named 
       directory, which will be created if it doesn't already 
       exist.""") 

该字符串的用途是什么:'-- C:\\Users\\MikeS\\Documents\\ImproveBKFS\\Python\\msg_extract'

使用简单的东西,比如--dir

parser.add_argument('-d', '--directory', required = True, 
       help = """Unpack the MIME message into the named 
       directory, which will be created if it doesn't already 
       exist.""") 

你解析args后,打印,随时了解解析器发现:

args = parser.parse_args() 
print(args) 

然后,如果你需要这个“目录”,使用像args.directory

变化这个问题,以及:

parser.add_argument('TestFile.msg') 

parser.add_argument('outfile') 

及用途:

with open(args.outfile, 'wb') as fp: #issues with open(args) 
msg = email.message_from_file(fp) 

我怀疑你的说法混淆了dest(或长选项名称)使用该值,可以是默认值,也可以是从命令行获得的值。

'C:\ Users \ MikeS \ Documents \ ImproveBKFS \ Python \ msg_extract'和'TestFile.msg'看起来像一个目录和文件名。但是它们正在用于add_argumentdest插槽中。您可能需要花些时间阅读​​文档,并练习一些更简单的示例。

+0

谢谢你,我看了一下python.org的argparse文档,但是在这个例子中如何使用它仍然有点困惑,但是你破解代码帮助我更充分地消化它。 – Mwspencer