はじめに
Aspose.Email FOSS for Python は、純粋な Python で Outlook 互換のメッセージファイルを作成、読み取り、変換するための、無料で MIT ライセンスのライブラリです。PyPI で aspose-email-foss として利用可能で、Windows、macOS、Linux、Docker、サーバーレス環境上で動作し、Microsoft Office への依存やプロプライエタリランタイムは不要です。
このライブラリは主に二つの領域をカバーします。メッセージの件名、本文、受信者、添付ファイルを操作するための高レベル MAPI レイヤー(MapiMessage)と、すべての .msg ファイルの基盤となる生の Compound File Binary コンテナを公開する低レベル構造レイヤー(MsgReader, CFBReader, CFBStorage, CFBStream)。
この記事では、確認済みの API の表層を基に、バージョン 26.3 で提供される主な機能を順に解説します。
主な機能
MapiMessage による高レベルメッセージ作成
MapiMessage は、ゼロから Outlook 互換メッセージを作成するための主要エントリーポイントです。件名と本文を指定して MapiMessage.create() を呼び出し、受信者と添付ファイルを追加し、最後に .msg ファイルへ直接保存します。
from aspose.email_foss import msg
message = msg.MapiMessage.create(
"Quarterly status update",
"Hello team,\n\nPlease review the attached summary.\n\nRegards,\nEngineering",
)
message.set_property(msg.PropertyId.SENDER_NAME, "Build Agent")
message.set_property(msg.PropertyId.SENDER_EMAIL_ADDRESS, "agent@example.com")
message.add_recipient("alice@example.com", display_name="Alice Example")
message.add_recipient(
"carol@example.com",
display_name="Carol Example",
recipient_type=msg.RECIPIENT_TYPE_CC,
)
message.add_attachment("report.txt", b"Summary content here.\n", mime_type="text/plain")
message.save("output.msg")
MSG ファイルの読み取りと検査
MsgReader は、既存の .msg ファイルに対して、MapiMessage に完全にロードせずに構造化されたアクセスを提供します。トップレベルのプロパティエントリ、受信者ストレージ、添付ファイルストレージを個別に公開し、大容量ファイルの検査や検証パイプラインに実用的です。
from aspose.email_foss import msg
with msg.MsgReader.from_file("output.msg") as reader:
header = reader.top_level_header
print(f"Recipients : {header.recipient_count}")
print(f"Attachments: {header.attachment_count}")
for entry in reader.iter_recipient_storages():
_, props = reader.parse_subobject_property_stream(entry.stream_id)
print(f" Recipient storage {entry.name}: {len(props)} property entries")
MSG ラウンドトリップ: 読み込み、変更、保存
MapiMessage はロード時に from_file()、書き込み時に save() をサポートしているため、完全な読み取り-変更-書き込みサイクルは数行で済みます。名前付きプロパティ、型付き列挙体、Unicode 文字列の処理は、set_property、PropertyId、MapiNamedProperty を通じて利用可能です。
from aspose.email_foss import msg
with msg.MapiMessage.from_file("original.msg") as message:
message.set_property(msg.PropertyId.SUBJECT, "Updated Subject")
message.save("updated.msg")
EML / RFC 5322 変換
MapiMessage.to_email_message() はロードされた MSG を標準的な Python email.message.EmailMessage オブジェクトに変換し、標準ライブラリを使用して RFC 5322 .eml 形式へエクスポートできるようにします。逆方向 (MapiMessage.from_email_message()) は、EmailMessage から MapiMessage を構築します。
from pathlib import Path
from aspose.email_foss import msg
with msg.MapiMessage.from_file("message.msg") as message:
eml_bytes = message.to_email_bytes()
Path("message.eml").write_bytes(eml_bytes)
# Reverse: load EML into MapiMessage
import email
raw_eml = Path("message.eml").read_bytes()
email_obj = email.message_from_bytes(raw_eml)
mapi = msg.MapiMessage.from_email_message(email_obj)
mapi.save("from_eml.msg")
CFB コンテナのトラバーサル
すべての .msg ファイルは Compound File Binary (CFB) コンテナです。CFBReader はディレクトリツリーへの読み取り専用アクセスを提供し、ストレージやストリームの一覧表示、階層の走査、生のストリームバイトの抽出を可能にします — MsgReader に依存せずに。
from aspose.email_foss.cfb import CFBReader
with CFBReader.from_file("message.msg") as reader:
print(f"CFB version : {reader.major_version}")
print(f"Sector size : {reader.sector_size}")
for depth, entry in reader.iter_tree():
indent = " " * depth
size = entry.stream_size if entry.is_stream() else "-"
print(f"{indent}{entry.name} [size={size}]")
添付ファイルの取り扱い
添付ファイルは MapiMessage.add_attachment()(バイナリデータ用)または MapiMessage.add_embedded_message_attachment()(ネストされた MSG メッセージ用)で追加されます。両方の方法はファイル名、バイト列、およびオプションの MIME タイプを受け取ります。
from aspose.email_foss import msg
message = msg.MapiMessage.create("Attachment demo", "See files below.")
message.add_attachment("data.csv", b"id,value\n1,100\n", mime_type="text/csv")
inner = msg.MapiMessage.create("Nested message", "This is embedded.")
message.add_embedded_message_attachment(inner, "nested.msg")
message.save("with_attachments.msg")
クイックスタート
pip install aspose-email-fossfrom aspose.email_foss import msg
# Create and save a minimal MSG
message = msg.MapiMessage.create("Hello World", "This is a test message.")
message.set_property(msg.PropertyId.SENDER_EMAIL_ADDRESS, "sender@example.com")
message.add_recipient("recipient@example.com", display_name="Recipient")
message.save("hello.msg")
# Load it back and convert to EML
with msg.MapiMessage.from_file("hello.msg") as loaded:
print(loaded.get_property_value(msg.PropertyId.SUBJECT))
eml = loaded.to_email_bytes()
open("hello.eml", "wb").write(eml)
サポートされている形式
| 形式 | 拡張子 | 読み取り | 書き込み |
|---|---|---|---|
| Compound File Binary | .cfb | ✓ | ✓ |
| Outlook メッセージ | .msg | ✓ | ✓ |
| EML / RFC 5322 | .eml | ✓ | ✓ |
オープンソースとライセンス
Aspose.Email FOSS for Python は MIT ライセンスの下でリリースされています。ソースリポジトリは github.com/aspose-email-foss にあり、パッケージは PyPI で aspose-email-foss として公開されています。商用利用、改変、再配布はすべて MIT 条項に基づき許可されています。