Как импортировать файлы .msg в Python вместе с вложениями из локального каталога

#python

#python

Вопрос:

Я работаю над задачей автоматизации электронной почты Outlook, где у меня есть файлы электронной почты Outlook .msg, хранящиеся в каталоге. Моя задача — извлечь информацию (текст письма, тексты вложений и т. Д.) Из файлов .msg и запустить NLP для их классификации. До сих пор я использовал extract_msg из https://pypi.org/project/extract-msg / и https://github.com/mattgwwalker/msg-extractor .Я могу извлекать основной текст письма, но следующие проблемы, с которыми я сталкиваюсь::

  1. Как извлечь текст из вложений, таких как pdf, текстовые файлы?
  2. Как прочитать электронное письмо, состоящее из нескольких частей (сообщение электронной почты с ответами)?

Я прочитал ответы из нескольких потоков, прежде чем написать свой собственный вопрос, но большинство ответов связаны с извлечением электронных писем непосредственно из 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’

Текст вложения = ‘Ваш счет готов к обработке’

Что-то вроде этого, любая помощь будет оценена, пожалуйста, дайте мне знать, если потребуется дополнительная информация.

Редактировать: Пожалуйста, прокомментируйте, если вы знаете какой-либо другой пакет, который можно использовать для решения этой задачи.

Комментарии:

1. Посмотрите на pypdf2

2. Это работает с вложениями в формате PDF, что является вторым этапом моей работы, но спасибо за предложение.

3. Вы получили решение для этого? Я работаю над аналогичным требованием.

4. Я опубликовал решение ниже, не стесняйтесь комментировать, если у вас есть какие-либо вопросы.

5. по какой-то причине msg.body возвращает значение «None» для тела my .msg Почему это?

Ответ №1:

В объектной модели Outlook используйте Application.Session.OpenSharedItem : передайте полное имя файла MSG и получите обратно MailItem объект.

Комментарии:

1. Спасибо за ответ, но я думаю, что это используется в кодировании на VBA, однако мое требование — использовать Python для этой задачи.

2. Объектная модель Outlook не знает и не заботится о том, вызывается ли она скриптом VB или Python.

Ответ №2:

существуют решения, подходящие для удовлетворения ваших требований. В своей работе я тестирую модуль MSG PY от independent soft. Это файловый модуль Microsoft Outlook .msg для Python. Модуль позволяет легко создавать / читать / анализировать / конвертировать файлы 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))
  

Комментарии:

1. Это выглядит великолепно, недавно добавлено для Python, когда я работал над этой задачей, мне пришлось много искать такое решение. Благодаря этому становится проще обрабатывать сообщения электронной почты.

Ответ №3:

Публикую решение, которое сработало для меня (как просил Amey P Naik). Как уже упоминалось, я пробовал несколько модулей, но только extract_msg работал для рассматриваемого случая. Я создал две функции для импорта текста сообщения Outlook и вложений в виде фрейма данных Pandas, первая функция создаст по одной папке для каждого сообщения электронной почты, а вторая импортирует данные из сообщения в фрейм данных. Вложения необходимо обрабатывать отдельно, используя цикл 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)
  

После запуска этих 2 функций у вас будет почти вся информация внутри фрейма данных Pandas, который вы можете использовать в соответствии с вашими потребностями. Если вам также необходимо извлечь содержимое из вложений, вам необходимо создать цикл для всех подкаталогов внутри родительского каталога, чтобы читать файлы вложений в соответствии с их форматом, например, в моем случае форматы были .pdf, .jpg, .png, .csv и т.д. Для получения данных из этого формата потребуются разные методы, например, для получения данных из pdf вам понадобится модуль распознавания текста Pytesseract.

Если вы найдете более простой способ извлечения содержимого из вложений, пожалуйста, опубликуйте свое решение здесь для дальнейшего использования, если у вас есть какие-либо вопросы, пожалуйста, прокомментируйте. Также, если в приведенном выше коде есть какие-либо возможности для улучшения, пожалуйста, не стесняйтесь выделить.

Комментарии:

1. Привет, как насчет использования метода get_body. Смотрите справочную ссылку: docs.python.org/3/library /…