御託
インターネット黎明期 (1995 年ぐらい?) から生き残っている Microsoft 製のメーラーの中で、異彩を放っているのが Outlook です。
メールデータの保管方法という観点からみると:
Outlook Express
- Outlook Express は dbx という独自データベースを採用。
- dbx は 2GB を超えると壊れてメールデータが無くなるという重大な不具合があり、騒ぎになりました。
- dbx は解析が成功しているようで DbxRescue という有名なツールがあります。
Windows Live メール
- Windows Live メールではデータベースに ESE を採用しています。ESE は ISAM エンジンの一種であり、OS のコンポーネントでもあるから信頼性が高いです。
- データベースとは別に
.eml
ファイルを保存しています。 -
実際のフォルダー階層にそって保存していることから、メーラーの移行は簡単にできます。 メーラーから見えるフォルダ階層と、ファイルシステムのフォルダ階層は異なることがあります。フォルダ作成後の「フォルダ名の変更」「フォルダの移動」操作は、データベース内の情報が書き変わるのみで、ファイルシステムのフォルダ階層には反映されませんでした。.eml
ファイルのみを用いてメーラーを移行する際には注意が必要です。
Outlook
- Outlook は PST という独自のストレージフォーマットを採用しています。
- ファイル形式の仕様は公開されているのですが… 厄介なのはメールのデータ構造が
.eml
ベースではないという点です。 - メール本文は HTML ではなく RTF で保存しています。
- RTF の書式で進化を続ける HTML のすべてを表現できるはずもなく、結局 RTF の中に HTML も含められるという仕様にして対応している模様です。
- その変態 RTF を完璧にレンダリングできるのは Outlook や Word ぐらいです。HTML 形式の
.eml
への変換は容易ではなく、情報の損失が発生する可能性があります。 - RTF から HTML を復元する方法についての、技術的なドキュメントを見つけました。
- 参考までに RTF のサンプルです。
-
.pst
ファイルを読み取りできるライブラリがあります。有志の方が開発されたオープンソースのものです。ほかにも存在すると思いますが、ひとまず私が動作確認したものをリストします:- C/C++
- Ruby
- Node.js
- C#/.NET
-
.pst
ファイルにはバージョンがあります。(※この項は何度か編集有)- Outlook 以外のソフトウェアで開く際には、対応しているかどうか確認した方が良いでしょう。
- 10 ~ 11 バイト目の値で判定します。この 3 つ以外にも存在します:
-
0x0e
= PST, ANSI format, 512 bytes block, 32-bit id&pointer // PST は POP3 専用 -
0x17
= PST, Unicode format, 512 bytes block, 64-bit id&pointer -
0x24
= OST, Unicode format, 4096 bytes block, 64-bit id&pointer, zlib support // OST は IMAP 専用
-
- ANSI format と Unicode format とでは、一部の構造体の形式が異なります。例: [MS-PST]: HEADER | Microsoft Learn
- 文字列型プロパティーのエンコードは 2 種類 (ANSI or Unicode) です。型で判別します。 Unicode (UTF-16LE) は
0x001F
、 ANSI は0x001E
です。 - ANSI 文字列が使用しているコードページ番号 (例: CP932 など) を確実に知る方法は不明です。
- Outlook は
.pst
ファイル内のメール・連絡先・予定などをファイルへ出力しようとするとき、アイテムごとに.msg
ファイルを出力します。-
.msg
ファイルは 複合ファイル です (zip のような、ファイル内にフォルダ階層があるもの)。 -
.doc
/.xls
/.ppt
など Microsoft Office で採用されている、なじみ深いファイル形式です。 -
.msg
ファイルを見る- 7-Zip で
.msg
ファイルの中身を見ることができます。例: https://user-images.githubusercontent.com/5955540/124115327-a1de6680-daa8-11eb-8b77-39dbaf7d415a.png - msgreader_demo 、 使用例
- 7-Zip で
-
-
.msg
ファイルを読み取りできるライブラリです。
Outlook からエクスポート
そういう訳で Outlook からの脱出にあたって、役立つと思われるツールを紹介いたします:
Outlook Export Tool
Thunderbird
Thunderbird 58 以上で ツール
→ 設定とデータのインポート
→ メールボックス
→ Outlook
次へ
をクリックすると、作業完了まで UI がフリーズします。気長に待ってください。
ローカルフォルダー
の Outlook インポート
にあります。
こちらは、真偽不明の情報です。
Thunderbird のインポート手順を用いるには、Thunderbird バージョン 38 およびそれ以降のバージョンでは Outlook と Eudora 向けのインポートウィザードが無効化されているため、古いバージョンの Thunderbird を使用する必要があります。
Thunderbird への移行 | Thunderbird ヘルプ
技術的な側面
ソースコードの MapiApi.cpp をサラッと読みました。
MAPILogonEx
からの IMAPISessionで、ガチの MAPI を叩いています。
readpst
(2025-08-20 追記) ChatGPT か何かに尋ねたところ、 libpst の readpst でエクスポートする方法が紹介されました。
readpst は Cygwin などで入手できます。
Thunderbird 向け
PST ファイルは、メール、連絡先、スケジュールなど、複数種類のオブジェクトをストアします。
readpst では、オプション指定により出力対象を選択できます。
$ readpst -h
ReadPST / LibPST v0.6.71
Little Endian implementation being used.
Usage: readpst [OPTIONS] {PST FILENAME}
OPTIONS:
-V - Version. Display program version
-C charset - character set for items with an unspecified character set
-D - Include deleted items in output
-L <level> - Set debug level; 1=debug,2=info,3=warn.
-M - Write emails in the MH (rfc822) format
-S - Separate. Write emails in the separate format
-a <attachment-extension-list> - Discard any attachment without an extension on the list
-b - Dont save RTF-Body attachments
-c[v|l] - Set the Contact output mode. -cv = VCard, -cl = EMail list
-d <filename> - Debug to file.
-e - As with -M, but include extensions on output files
-h - Help. This screen
-j <integer> - Number of parallel jobs to run
-k - KMail. Output in kmail format
-m - As with -e, but write .msg files also
-o <dirname> - Output directory to write files to. CWD is changed *after* opening pst file
-q - Quiet. Only print error messages
-r - Recursive. Output in a recursive format
-t[eajc] - Set the output type list. e = email, a = attachment, j = journal, c = contact
-u - Thunderbird mode. Write two extra .size and .type files
-w - Overwrite any output mbox files
-8 - Output bodies in UTF-8, rather than original encoding, if UTF-8 version is available
Only one of -M -S -e -k -m -r should be specified
ここではメールのみを対象としたエクスポートを試します。
$ readpst -C CP932 -M -o export -u Outlook2003.pst
Opening PST file and indexes...
Processing Folder "削除済みアイテム"
Processing Folder "サンプル"
"サンプル" - 16 items done, 0 items skipped.
"Outlook2003" - 2 items done, 0 items skipped.
Thunderbird のメッセージストアの中へ直接コピーする形でインポートできるように便宜を図っているのかもしれませんが、
今の Thunderbird 142 とは互換性がありません。
リネームしたり移動したりが必要になります。
変更前:
$ tree export -ah
export
└── [ 0] Outlook2003
├── [ 4] .size
├── [ 2] .type
└── [ 0] サンプル
├── [ 6] .size
├── [ 2] .type
└── [6.9M] mbox
2 directories, 5 files
変更後:
$ tree export -ah
export
├── [ 0] Outlook2003
└── [ 0] Outlook2003.sbd
├── [6.9M] サンプル
└── [ 0] サンプル.sbd
2 directories, 2 files
Note: Outlook2003
(*.
) が mbox ファイル、 Outlook2003.sbd
(*.sbd
) はフォルダーです。
pst_to_eml
Thunderbird 向け
Thunderbird 向けに PST ファイル内のメールを一括エクスポートしたいが readpst
の実行結果に多少不便があると感じたので、代替手段を開発しました。 pst_to_eml
を改修して Thunderbird 向けの mbox を出力できるようにしました。
npx
(Node package executor) で使用可能です。
C:\Users\KU>npx @hiraokahypertools/pst_to_eml export-mbox -h
Usage: pst_to_eml export-mbox [options] <pstFilePath> <saveToDir>
export items inside pst file to Thunderbird mbox format
Options:
--ansi-encoding <encoding> Set ANSI encoding (used by iconv-lite) for non Unicode text in msg file
-h, --help display help for command
こちらの pst_to_eml は、 readpst のベースである libpst とは異なる技術を使用しています。
epfromer/pst-extractor: Extract objects from MS Outlook/Exchange PST files の fork を使用して開発しています。
そのため変換結果に不具合があったり、想定しないものが出力されたりする可能性があります。ご注意ください。
変換します:
C:\Users\KU>npx @hiraokahypertools/pst_to_eml export-mbox Outlook2003.pst export
convert export\Outlook2003
convert export\Outlook2003.sbd\削除済みアイテム
convert export\Outlook2003.sbd\サンプル
エクスポート結果です:
$ tree export -ah
export
├── [ 0] Outlook2003
└── [ 0] Outlook2003.sbd
├── [7.0M] サンプル
├── [ 0] サンプル.sbd
├── [ 0] 削除済みアイテム
└── [ 0] 削除済みアイテム.sbd
3 directories, 3 files
Outlook へインポート
逆に「これから Outlook を使いたいので、他のメーラーからデータを引っ越しする」ことを想定して、ツールを探してみました。
Windows Live Mail
エクスポート機能で、Outlook にメールをエクスポートする機能があります。
ファイル
→ 電子メールのエクスポート
→ 電子メール メッセージ
を選択します。
Microsoft Exchange
を選択します。
プロファイルを選択するようになっている場合は尋ねられます。
複数のフォルダーを選択する場合は、Ctrl 押下のマウス左クリックで On/Off 切り替えです。
Outlook の Outlook データ ファイル
にできるようです。
IMAP4 server 経由
mozillaZine の Import .pst files より。
IMAP4 サーバー (例えば hMailServer) を経由して、メールデータを移行する方法があります。
失敗例: 受信トレイへドロップする
方法:
-
.eml
ファイルを受信トレイ
へドロップする。
結果:
- 新規メールの作成画面が表示されて、
.eml
ファイルが添付されました。
失敗例: フォルダーへドロップする
方法:
-
.eml
ファイルを受信トレイ
以外のフォルダーへドロップする。
結果:
- フォルダーにメールは追加されました。
- しかしプレビューには適さないようです。
- プレビュー画面での表示:
このファイルのプレビューを表示できません。このファイル形式のプレビューアーがインストールされていません。
- ダブルクリックした際のプロンプト表示:
ファイルを開く前に、ファイルが信頼できる所からのものであることを確認してください。
- プレビュー画面での表示:
msg → eml ファイル
msg
(Outlook が主に扱う) ファイルから eml
(一般的なメーラーで扱う RFC822 形式) に変換する方法について検討します。
msg
ファイルは 1 通のメッセージです。 形式は様々あり、メール・連絡先・スケジュールあるいはその他の形式である可能性があります。 Outlook で開いてみるまでは、通常わかりません。
7-Zip を使用すると中身を確認できます:
__substg1.0_001A001F
(Unicode msg の場合) あるいは __substg1.0_001A001E
(ANSI msg の場合) ファイルを開くと (F3 キー押下)
IPM.Note
などのテキストが露出します。これがメッセージの形式を示します。
参考: アイテムの種類とメッセージ クラス | Microsoft Learn
ruby-msg
Google Code Archive - Long-term storage for Google Code Project Hosting.
紹介サイト
mfcmapi
Releases · stephenegriffin/mfcmapi
紹介サイト
libpst
libpst Utilities - Version 0.6.76
紹介サイト