From 99a998f90ba5630833752c49c9af76430226bd32 Mon Sep 17 00:00:00 2001 From: Sebastian Husch Lee Date: Mon, 24 Feb 2025 08:12:32 +0100 Subject: [PATCH] feat: Add MSGToDocument converter (#8868) * Initial commit of MSG converter from Bijay * Updates to the MSG converter * Add license header * Add tests for msg converter * Update converter * Expanding tests * Update docstrings * add license header * Add reno * Add to inits and pydocs * Add test for empty input * Fix types * Fix mypy --------- Co-authored-by: Bijay Gurung --- docs/pydoc/config/converters_api.yml | 1 + haystack/components/converters/__init__.py | 2 + haystack/components/converters/msg.py | 194 ++++++++++++++++++ pyproject.toml | 1 + ...o-document-converter-79338eef22a3fd82.yaml | 6 + .../converters/test_msg_to_document.py | 38 ++++ test/test_files/msg/sample.msg | Bin 0 -> 67584 bytes 7 files changed, 242 insertions(+) create mode 100644 haystack/components/converters/msg.py create mode 100644 releasenotes/notes/add-msg-to-document-converter-79338eef22a3fd82.yaml create mode 100644 test/components/converters/test_msg_to_document.py create mode 100644 test/test_files/msg/sample.msg diff --git a/docs/pydoc/config/converters_api.yml b/docs/pydoc/config/converters_api.yml index 69a35d4e5..487ac5ea2 100644 --- a/docs/pydoc/config/converters_api.yml +++ b/docs/pydoc/config/converters_api.yml @@ -9,6 +9,7 @@ loaders: "html", "json", "markdown", + "msg", "openapi_functions", "output_adapter", "pdfminer", diff --git a/haystack/components/converters/__init__.py b/haystack/components/converters/__init__.py index 2c9570b1c..6036fa6db 100644 --- a/haystack/components/converters/__init__.py +++ b/haystack/components/converters/__init__.py @@ -14,6 +14,7 @@ _import_structure = { "html": ["HTMLToDocument"], "json": ["JSONConverter"], "markdown": ["MarkdownToDocument"], + "msg": ["MSGToDocument"], "openapi_functions": ["OpenAPIServiceToFunctions"], "output_adapter": ["OutputAdapter"], "pdfminer": ["PDFMinerToDocument"], @@ -31,6 +32,7 @@ if TYPE_CHECKING: from .html import HTMLToDocument from .json import JSONConverter from .markdown import MarkdownToDocument + from .msg import MSGToDocument from .openapi_functions import OpenAPIServiceToFunctions from .output_adapter import OutputAdapter from .pdfminer import PDFMinerToDocument diff --git a/haystack/components/converters/msg.py b/haystack/components/converters/msg.py new file mode 100644 index 000000000..d20a7efd5 --- /dev/null +++ b/haystack/components/converters/msg.py @@ -0,0 +1,194 @@ +# SPDX-FileCopyrightText: 2022-present deepset GmbH +# +# SPDX-License-Identifier: Apache-2.0 + +import io +import os +from pathlib import Path +from typing import Any, Dict, List, Optional, Tuple, Union + +from haystack import Document, component, logging +from haystack.components.converters.utils import get_bytestream_from_source, normalize_metadata +from haystack.dataclasses import ByteStream +from haystack.lazy_imports import LazyImport + +with LazyImport("Run 'pip install python-oxmsg'") as oxmsg_import: + from oxmsg import Message, recipient + + +logger = logging.getLogger(__name__) + + +@component +class MSGToDocument: + """ + Converts Microsoft Outlook .msg files into Haystack Documents. + + This component extracts email metadata (such as sender, recipients, CC, BCC, subject) and body content from .msg + files and converts them into structured Haystack Documents. Additionally, any file attachments within the .msg + file are extracted as ByteStream objects. + + ### Example Usage + + ```python + from haystack.components.converters.msg import MSGToDocument + from datetime import datetime + + converter = MSGToDocument() + results = converter.run(sources=["sample.msg"], meta={"date_added": datetime.now().isoformat()}) + documents = results["documents"] + attachments = results["attachments"] + print(documents[0].content) + ``` + """ + + def __init__(self, store_full_path: bool = False) -> None: + """ + Creates a MSGToDocument component. + + :param store_full_path: + If True, the full path of the file is stored in the metadata of the document. + If False, only the file name is stored. + """ + oxmsg_import.check() + self.store_full_path = store_full_path + + @staticmethod + def _is_encrypted(msg: "Message") -> bool: + """ + Determines whether the provided MSG file is encrypted. + + :param msg: The MSG file as a parsed Message object. + :returns: True if the MSG file is encrypted, otherwise False. + """ + return "encrypted" in msg.message_headers.get("Content-Type", "") + + @staticmethod + def _create_recipient_str(recip: "recipient.Recipient") -> str: + """ + Formats a recipient's name and email into a single string. + + :param recip: A recipient object extracted from the MSG file. + :returns: A formatted string combining the recipient's name and email address. + """ + recip_str = "" + if recip.name != "": + recip_str += f"{recip.name} " + if recip.email_address != "": + recip_str += f"{recip.email_address}" + return recip_str + + def _convert(self, file_content: io.BytesIO) -> Tuple[str, List[ByteStream]]: + """ + Converts the MSG file content into text and extracts any attachments. + + :param file_content: The MSG file content as a binary stream. + :returns: A tuple containing the extracted email text and a list of ByteStream objects for attachments. + :raises ValueError: If the MSG file is encrypted and cannot be read. + """ + msg = Message.load(file_content) + if self._is_encrypted(msg): + raise ValueError("The MSG file is encrypted and cannot be read.") + + txt = "" + + # Sender + if msg.sender is not None: + txt += f"From: {msg.sender}\n" + + # To + recipients_str = ",".join(self._create_recipient_str(r) for r in msg.recipients) + if recipients_str != "": + txt += f"To: {recipients_str}\n" + + # CC + cc_header = msg.message_headers.get("Cc") or msg.message_headers.get("CC") + if cc_header is not None: + txt += f"Cc: {cc_header}\n" + + # BCC + bcc_header = msg.message_headers.get("Bcc") or msg.message_headers.get("BCC") + if bcc_header is not None: + txt += f"Bcc: {bcc_header}\n" + + # Subject + if msg.subject != "": + txt += f"Subject: {msg.subject}\n" + + # Body + if msg.body is not None: + txt += "\n" + msg.body + + # attachments + attachments = [ + ByteStream( + data=attachment.file_bytes, meta={"file_path": attachment.file_name}, mime_type=attachment.mime_type + ) + for attachment in msg.attachments + if attachment.file_bytes is not None + ] + + return txt, attachments + + @component.output_types(documents=List[Document], attachments=List[ByteStream]) + def run( + self, + sources: List[Union[str, Path, ByteStream]], + meta: Optional[Union[Dict[str, Any], List[Dict[str, Any]]]] = None, + ) -> Dict[str, Union[List[Document], List[ByteStream]]]: + """ + Converts MSG files to Documents. + + :param sources: + List of file paths or ByteStream objects. + :param meta: + Optional metadata to attach to the Documents. + This value can be either a list of dictionaries or a single dictionary. + If it's a single dictionary, its content is added to the metadata of all produced Documents. + If it's a list, the length of the list must match the number of sources, because the two lists will + be zipped. + If `sources` contains ByteStream objects, their `meta` will be added to the output Documents. + + :returns: + A dictionary with the following keys: + - `documents`: Created Documents. + - `attachments`: Created ByteStream objects from file attachments. + """ + if len(sources) == 0: + return {"documents": [], "attachments": []} + + documents = [] + all_attachments = [] + meta_list = normalize_metadata(meta, sources_count=len(sources)) + + for source, metadata in zip(sources, meta_list): + try: + bytestream = get_bytestream_from_source(source) + except Exception as e: + logger.warning("Could not read {source}. Skipping it. Error: {error}", source=source, error=e) + continue + try: + text, attachments = self._convert(io.BytesIO(bytestream.data)) + except Exception as e: + logger.warning( + "Could not read {source} and convert it to Document, skipping. {error}", source=source, error=e + ) + continue + + merged_metadata = {**bytestream.meta, **metadata} + + if not self.store_full_path and "file_path" in bytestream.meta: + merged_metadata["file_path"] = os.path.basename(bytestream.meta["file_path"]) + + documents.append(Document(content=text, meta=merged_metadata)) + for attachment in attachments: + attachment_meta = { + **merged_metadata, + "parent_file_path": merged_metadata["file_path"], + "file_path": attachment.meta["file_path"], + } + all_attachments.append( + ByteStream(data=attachment.data, meta=attachment_meta, mime_type=attachment.mime_type) + ) + + return {"documents": documents, "attachments": all_attachments} diff --git a/pyproject.toml b/pyproject.toml index 12d3c4b02..f4175fd14 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -113,6 +113,7 @@ extra-dependencies = [ "jq", # JSONConverter "openpyxl", # XLSXToDocument "tabulate", # XLSXToDocument + "python-oxmsg", # MSGToDocument "nltk>=3.9.1", # NLTKDocumentSplitter diff --git a/releasenotes/notes/add-msg-to-document-converter-79338eef22a3fd82.yaml b/releasenotes/notes/add-msg-to-document-converter-79338eef22a3fd82.yaml new file mode 100644 index 000000000..df42d3cce --- /dev/null +++ b/releasenotes/notes/add-msg-to-document-converter-79338eef22a3fd82.yaml @@ -0,0 +1,6 @@ +--- +features: + - | + Add a new MSGToDocument component to convert .msg files into Haystack Document objects. + - Extracts email metadata (e.g. sender, recipients, CC, BCC, subject) and body content into a Document. + - Converts attachments into ByteStream objects which can be passed onto a FileTypeRouter + relevant converters. diff --git a/test/components/converters/test_msg_to_document.py b/test/components/converters/test_msg_to_document.py new file mode 100644 index 000000000..a69172a03 --- /dev/null +++ b/test/components/converters/test_msg_to_document.py @@ -0,0 +1,38 @@ +# SPDX-FileCopyrightText: 2022-present deepset GmbH +# +# SPDX-License-Identifier: Apache-2.0 + +from haystack.components.converters.msg import MSGToDocument + + +class TestMSGToDocument: + def test_run(self, test_files_path): + converter = MSGToDocument(store_full_path=True) + paths = [test_files_path / "msg" / "sample.msg"] + result = converter.run(sources=paths, meta={"date_added": "2021-09-01T00:00:00"}) + assert len(result["documents"]) == 1 + assert result["documents"][0].content.startswith('From: "Sebastian Lee"') + assert result["documents"][0].meta == { + "date_added": "2021-09-01T00:00:00", + "file_path": str(test_files_path / "msg" / "sample.msg"), + } + assert len(result["attachments"]) == 1 + assert result["attachments"][0].mime_type == "application/pdf" + assert result["attachments"][0].meta == { + "date_added": "2021-09-01T00:00:00", + "parent_file_path": str(test_files_path / "msg" / "sample.msg"), + "file_path": "sample_pdf_1.pdf", + } + + def test_run_wrong_file_type(self, test_files_path, caplog): + converter = MSGToDocument(store_full_path=False) + paths = [test_files_path / "pdf" / "sample_pdf_1.pdf"] + result = converter.run(sources=paths, meta={"date_added": "2021-09-01T00:00:00"}) + assert len(result["documents"]) == 0 + assert "msg_file is not an Outlook MSG file" in caplog.text + + def test_run_empty_sources(self, test_files_path): + converter = MSGToDocument(store_full_path=False) + result = converter.run(sources=[]) + assert len(result["documents"]) == 0 + assert len(result["attachments"]) == 0 diff --git a/test/test_files/msg/sample.msg b/test/test_files/msg/sample.msg new file mode 100644 index 0000000000000000000000000000000000000000..7fd917209403901352ba776d8ec70ddba882cf2e GIT binary patch literal 67584 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