如何从本地目录导入Python中的.msg文件以及附件

如何从本地目录导入Python中的.msg文件以及附件,python,Python,我正在处理Outlook电子邮件自动化任务,其中Outlook的.msg电子邮件文件存储在一个目录中。我的任务是从.msg文件中提取信息(电子邮件正文、附件文本等),并运行NLP对其进行分类。到目前为止,我已经使用了extract_msg from and。我能够提取邮件正文文本,但我面临的下一个挑战是: 如何从pdf、文本文件等附件中提取文本 如何阅读由多部分组成的电子邮件(带有回复线索的电子邮件) 在写我自己的问题之前,我阅读了多个线程的答案,但大多数答案都与直接从Outlook.exe提取

我正在处理Outlook电子邮件自动化任务,其中Outlook的.msg电子邮件文件存储在一个目录中。我的任务是从.msg文件中提取信息(电子邮件正文、附件文本等),并运行NLP对其进行分类。到目前为止,我已经使用了extract_msg from and。我能够提取邮件正文文本,但我面临的下一个挑战是:

  • 如何从pdf、文本文件等附件中提取文本
  • 如何阅读由多部分组成的电子邮件(带有回复线索的电子邮件)
  • 在写我自己的问题之前,我阅读了多个线程的答案,但大多数答案都与直接从Outlook.exe提取电子邮件有关,但是我不需要从Outlook提取信息,而是将Outlook邮件作为.msg文件存储在本地目录中

    我目前的进展是:

    import extract_msg
    import pandas as pd
    import os
    
    direct = os.getcwd() # directory object to be passed to the function for accessing emails
    
    ext = '.msg' # type of files in the folder to be read
    
    def DataImporter(directory, extension):
        my_list = []
        for i in os.listdir(direct):
            if i.endswith(ext):
                msg = extract_msg.Message(i)
                my_list.append([msg.filename,msg.sender,msg.to, msg.date, msg.subject, msg.body])
                global df
                df = pd.DataFrame(my_list, columns = ['File Name','From','To','Date','Subject','MailBody Text'])
        print(df.shape[0],' rows imported')
    
    DataImporter(direct,ext)
    
    要求是这样的:

    邮件正文='这是一个示例电子邮件正文文本'

    附件='Invoice123'

    附件文本='您的发票已准备好处理'

    像这样的事情,任何帮助将不胜感激,请让我知道如果需要进一步的信息


    编辑:如果您知道可用于完成此任务的任何其他软件包,请发表意见。

    在Outlook对象模型中,使用
    Application.Session.OpenSharedItem
    :传递完全限定的MSG文件名,然后返回
    MailItem
    对象。

    发布对我有效的解决方案(按照Amey p Naik的要求)。 如前所述,我尝试了多个模块,但只有extract_msg适用于手头的案例。 我创建了两个函数,用于将outlook邮件文本和附件作为数据框导入,第一个函数将为电子邮件分别创建一个文件夹,第二个函数将数据从邮件导入数据框。需要在父目录的子目录上使用for循环单独处理附件。下面是我用注释创建的两个函数:

    # 1). Import the required modules and setup working directory
    
    import extract_msg
    import os
    import pandas as pd
    direct = os.getcwd() # directory object to be passed to the function for accessing emails, this is where you will store all .msg files
    ext = '.msg' #type of files in the folder to be read
    
    # 2). Create separate folder by email name and extract data 
    
    def content_extraction(directory,extension):
        for mail in os.listdir(directory):
            try:
                if mail.endswith(extension):
                    msg = extract_msg.Message(mail) #This will create a local 'msg' object for each email in direcory
                    msg.save() #This will create a separate folder for each email inside the parent folder and save a text file with email body content, also it will download all attachments inside this folder.            
            except(UnicodeEncodeError,AttributeError,TypeError) as e:
                pass # Using this as some emails are not processed due to different formats like, emails sent by mobile.
    
    content_extraction(direct,ext)
    
    #3).Import the data to Python DataFrame using the extract_msg module
    #note this will not import data from the sub-folders inside the parent directory 
    #rather it will extract the information from .msg files, you can use a loop instead 
    #to directly import data from the files saved on sub-folders.
    
    def DataImporter(directory, extension):
        my_list = []
        for i in os.listdir(direct):
            try:
                if i.endswith(ext):
                    msg = extract_msg.Message(i)
                    my_list.append([msg.filename,msg.sender,msg.to, msg.date, msg.subject, msg.body, msg.message_id]) #These are in-built features of '**extract_msg.Message**' class
                    global df
                    df = pd.DataFrame(my_list, columns = ['File Name','From','To','Date','Subject','MailBody Text','Message ID'])
                    print(df.shape[0],' rows imported')
            except(UnicodeEncodeError,AttributeError,TypeError) as e:
                pass
    
    DataImporter(direct,ext)
    
    运行这两个函数后,您将在一个数据框中拥有几乎所有的信息,您可以根据需要使用这些信息。如果还需要从附件中提取内容,则需要为父目录中的所有子目录创建一个循环,以便按照其格式读取附件文件,就像我的例子中的格式是.pdf、.jpg、.png、,.csv等。从这些格式获取数据需要不同的技术,例如从pdf获取数据需要PytesseractOCR模块


    如果您找到一种更简单的方法从附件中提取内容,请在此处发布您的解决方案以供将来参考,如果您有任何问题,请发表评论。此外,如果上述代码中存在任何改进范围,请随时强调。

    有适合您的要求的解决方案。 在我的工作中,我从独立软件测试MSG-PY模块。 这是用于Python的Microsoft Outlook.msg文件模块。 该模块允许您轻松创建/读取/解析/转换Outlook.msg文件。 例如:

    from independentsoft.msg import Message
    from independentsoft.msg import Attachment
    
    message = Message(file_path = "e:\\message.msg")
    
    for i in range(len(message.attachments)):
        attachment = message.attachments[i]
        attachment.save("e:\\" + str(attachment.file_name))
    

    研究一下在PDF附件上工作的PyPDF2,这是我工作的第二个阶段,但是谢谢你的建议。你找到解决方案了吗?我正在处理一个类似的要求。我已经在下面发布了解决方案,如果您有任何问题,请随时发表意见。出于某种原因,msg.body在我的.msg的正文中返回为“无”。这是为什么?感谢您的回复,但我认为这是在VBA编码中使用的,但是我的要求是使用Python来完成这项任务。Outlook对象模型不知道也不关心它是由VB脚本调用还是由Python调用。您好,使用get_body方法如何。请参阅参考链接:这看起来很棒,它是最近为Python添加的,当我在做这个任务时,我不得不搜索很多这样的解决方案。这样,处理电子邮件就变得更简单了。