Как парсить файлы MSG в Python
aspose-email-foss for Python предоставляет чистый Python API для чтения файлов Outlook MSG без зависимостей от Microsoft Office. Загрузите файл в объект MapiMessage, чтобы получить доступ ко всем данным сообщения.
Пошаговое руководство
Шаг 1: Установите пакет
pip install aspose-email-fossТребуется Python 3.10 или новее.
Шаг 2: Импортировать класс MapiMessage
from aspose.email_foss.msg import MapiMessageШаг 3: Загрузить файл MSG
msg = MapiMessage.from_file("message.msg")Для мягкого разбора повреждённых файлов передайте strict=False:
msg = MapiMessage.from_file("message.msg", strict=False)Шаг 4: Доступ к свойствам сообщения
print(f"Subject: {msg.subject}")
print(f"Body: {msg.body}")
print(f"HTML Body: {msg.body_html[:200] if msg.body_html else 'None'}")
print(f"Message Class: {msg.message_class}")Шаг 5: Список вложений
for att in msg.iter_attachments_info():
name = att.storage_name
is_embedded = att.is_embedded_message
print(f"Attachment: {name}, embedded={is_embedded}")Шаг 6: Проверка низкоуровневой структуры CFB
from aspose.email_foss.cfb import CFBReader
reader = CFBReader.from_file("message.msg")
print(f"Directory entries: {reader.directory_entry_count}")
for entry in reader.iter_streams():
print(f" Stream: {entry}")
reader.close()Общие проблемы и решения
CFBError при загрузке
Файл не является действительным контейнером CFB. Убедитесь, что это настоящий файл Outlook MSG, а не EML.
Тело пусто, но HTML‑тело содержит контент
Некоторые сообщения хранят содержимое только в HTML. Проверьте msg.body_html, когда msg.body возвращает None.
Предупреждения проверки
Получите доступ к msg.validation_issues, чтобы увидеть кортеж предупреждений о соответствии для загруженного файла.
Часто задаваемые вопросы (FAQ)
Могу ли я читать файлы EML?
Не напрямую. Библиотека обрабатывает формат MSG (CFB). Сначала преобразуйте содержимое EML в объект EmailMessage, затем используйте MapiMessage.from_email_message().
Загружает ли процесс чтения все данные вложения в память?
Нет. Метаданные вложения читаются по запросу. Используйте iter_attachments_info() для лёгкой итерации.
Это потокобезопасно?
Каждый MapiMessage экземпляр независим. Параллельные чтения из разных экземпляров безопасны.