Outlook のメールデータ：インポート・エクスポート

# Outlook からエクスポート

インターネット黎明期 (1995 年ぐらい？) から生き残っている Microsoft 製のメーラーの中で、異彩を放っているのが Outlook です。

メールデータの保管方法という観点からみると：

Outlook Express

- Outlook Express は dbx という独自データベースを採用。
- dbx は 2GB を超えると壊れてメールデータが無くなるという重大な不具合があり、騒ぎになりました。
- dbx は解析が成功しているようで [DbxRescue](https://www.vector.co.jp/soft/win95/net/se271878.html) という有名なツールがあります。

Windows Live メール

- Windows Live メールではデータベースに [ESE](https://en.wikipedia.org/wiki/Extensible_Storage_Engine) を採用しています。ESE は ISAM エンジンの一種であり、OS のコンポーネントでもあるから信頼性が高いです。
- データベースとは別に `.eml` ファイルを保存しています。
- 
実際のフォルダー階層にそって保存していることから、メーラーの移行は簡単にできます
。 メーラーから見えるフォルダ階層と、ファイルシステムのフォルダ階層は異なることがあります。フォルダ作成後の「フォルダ名の変更」「フォルダの移動」操作は、データベース内の情報が書き変わるのみで、ファイルシステムのフォルダ階層には反映されませんでした。 `.eml` ファイルのみを用いてメーラーを移行する際には注意が必要です。

Outlook

- Outlook は [PST](https://en.wikipedia.org/wiki/Personal_Storage_Table) という独自のストレージフォーマットを採用しています。
- ファイル形式の仕様は[公開](https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-pst/141923d5-15ab-4ef1-a524-6dce75aae546)されているのですが… 厄介なのはメールのデータ構造が `.eml` ベースではないという点です。
- メール本文は HTML ではなく RTF で保存しています。
  - RTF の書式で進化を続ける HTML のすべてを表現できるはずもなく、結局 RTF の中に HTML も含められるという仕様にして対応している模様です。
  - その変態 RTF を完璧にレンダリングできるのは Outlook や Word ぐらいです。HTML 形式の `.eml` への変換は容易ではなく、情報の損失が発生する可能性があります。
  - RTF から HTML を復元する方法についての、技術的なドキュメントを見つけました。
    - 参考: [[MS-OXRTFEX]: Extracting Encapsulated HTML from RTF | Microsoft Docs](https://docs.microsoft.com/en-us/openspecs/exchange_server_protocols/ms-oxrtfex/906fbb0f-2467-490e-8c3e-bdc31c5e9d35)
  - 参考までに RTF のサンプルです。
    - https://github.com/HiraokaHyperTools/msgreader/blob/master/test/sent.rtf
- `.pst` ファイルを読み取りできるライブラリがあります。有志の方が開発されたオープンソースのものです。ほかにも存在すると思いますが、ひとまず私が動作確認したものをリストします:
  - C/C++
    - [libpst Utilities - Version 0.6.76](https://www.five-ten-sg.com/libpst/)
  - Ruby
    - [aquasync/ruby-msg: A library for reading and converting Outlook msg and pst files (mapi message stores)](https://github.com/aquasync/ruby-msg)
  - Node.js
    - [epfromer/pst-extractor: Extract objects from MS Outlook/Exchange PST files](https://github.com/epfromer/pst-extractor)
  - C#/.NET
    - [iluvadev/XstReader: XstReader is an open source viewer for Microsoft Outlook’s .ost and .pst files (also those protected by unknown password). You can view and inspect all content and export messages and attachments (also in .msg format). Written entirely in C#, with no dependency on any Microsoft Office components. This project is the evolution of Dijji's XstReader](https://github.com/iluvadev/XstReader)
- `.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](https://learn.microsoft.com/en-us/openspecs/office_file_formats/ms-pst/c9876f5a-664b-46a3-9887-ba63f113abf5)
  - 文字列プロパティーのエンコード (ANSI or Unicode) については、各々のプロパティーが持っている型の値 (Unicode = 0x001F PtypString, ANSI = 0x001E PtypString8) で判別します。
  - ANSI 文字列が使用しているコードページ番号 (例: CP932 など) を確実に知る方法は不明です。
- Outlook は `.pst` ファイル内のメール・連絡先・予定などをファイルへ出力しようとするとき、アイテムごとに `.msg` ファイルを出力します。
  - `.msg` ファイルは [複合ファイル](https://learn.microsoft.com/ja-jp/windows/win32/stg/compound-files) です (zip のような、ファイル内にフォルダ階層があるもの)。
    - 参考: [Compound File Binary Format - Wikipedia](https://en.wikipedia.org/wiki/Compound_File_Binary_Format)
  - `.doc`/`.xls`/`.ppt` など Microsoft Office で採用されている、なじみ深いファイル形式です。
  - `.msg` ファイルを見る
    - 7-Zip で `.msg` ファイルの中身を見ることができます。例: https://user-images.githubusercontent.com/5955540/124115327-a1de6680-daa8-11eb-8b77-39dbaf7d415a.png
    - [msgreader_demo](https://hiraokahypertools.github.io/msgreader_demo/) 、 [使用例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/a91f960d-8da4-08cb-986e-7e8337089417.png)
- `.msg` ファイルを読み取りできるライブラリです。
  - C#
    - [Sicos1977/MSGReader: C# Outlook MSG file reader without the need for Outlook](https://github.com/Sicos1977/MSGReader)
  - Ruby
    - [aquasync/ruby-msg: A library for reading and converting Outlook msg and pst files (mapi message stores)](https://github.com/aquasync/ruby-msg)
  - Node.js
    - [msgreader - npm search](https://www.npmjs.com/search?q=msgreader)


そういう訳で Outlook からの脱出にあたって、役立つと思われるツールを紹介いたします：

## Outlook Export Tool

[Outlook Export Tool](http://www.yamamototakashi.com/soft/outlookexporttool/index.html)

## Thunderbird

[Thunderbird](https://www.thunderbird.net/ja/) 58 以上で `ツール` → `設定とデータのインポート` → `メールボックス` → `Outlook`

![2021-12-14_21h09_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/0ee9028c-91a2-7c1a-2f49-a142c810d41f.png)

![2021-12-14_21h09_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/850ae32b-a302-cced-c73d-9494f42413cd.png)

`次へ` をクリックすると、作業完了まで UI がフリーズします。気長に待ってください。

![2021-12-14_21h09_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/d84256e2-8b33-d2f3-7902-8dd112c61f33.png)

`ローカルフォルダー` の `Outlook インポート` にあります。

![2021-12-14_21h11_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/93dc2ebd-0384-6a2f-d763-1b286b70898a.png)

こちらは、真偽不明の情報です。

> Thunderbird のインポート手順を用いるには、Thunderbird バージョン 38 およびそれ以降のバージョンでは Outlook と Eudora 向けのインポートウィザードが無効化されているため、古いバージョンの Thunderbird を使用する必要があります。

[Thunderbird への移行 | Thunderbird ヘルプ](https://support.mozilla.org/ja/kb/switching-thunderbird) 

### 技術的な側面

ソースコードの [MapiApi.cpp](https://searchfox.org/comm-central/source/mailnews/import/src/MapiApi.cpp) をサラッと読みました。
`MAPILogonEx` からの [IMAPISession](https://docs.microsoft.com/ja-jp/office/client-developer/outlook/mapi/imapisessioniunknown)で、ガチの MAPI を叩いています。

# Outlook へインポート

逆に「これから Outlook を使いたいので、他のメーラーからデータを引っ越しする」ことを想定して、ツールを探してみました。

## Windows Live Mail

エクスポート機能で、Outlook にメールをエクスポートする機能があります。

`ファイル` → `電子メールのエクスポート` → `電子メール メッセージ` を選択します。

![2021-12-14_21h31_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/47bc42a1-d899-ebc7-a904-715f45b379f8.png)

`Microsoft Exchange` を選択します。

![2021-12-14_21h31_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/b7ae015d-fb0c-a428-4a21-ae3a8ee0387d.png)

![2021-12-14_21h31_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/cc732e1e-f44e-0085-923f-7572b01e810d.png)

プロファイルを選択するようになっている場合は尋ねられます。

![2021-12-14_21h32_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/0636e5f0-b775-a008-f4e0-b821aed6794f.png)

![2021-12-14_21h32_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/bfc1b6af-c6ec-359a-223c-37e16a4ea04f.png)

複数のフォルダーを選択する場合は、Ctrl 押下のマウス左クリックで On/Off 切り替えです。

![2021-12-14_21h40_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/9c170ccc-3fcc-a0cb-e167-d8b6cf70c42c.png)

![2021-12-14_21h32_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/34880f8c-0485-859f-a0f6-a0e86dd4e099.png)


Outlook の `Outlook データ ファイル` にできるようです。

![2021-12-14_21h32_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/8feb2970-e29b-63cf-5ad4-b112bbb2a19f.png)

## IMAP4 server 経由

mozillaZine の [Import .pst files](http://kb.mozillazine.org/Import_.pst_files#IMAP_.28works_with_any_operating_system.29) より。
IMAP4 サーバー (例えば [hMailServer](https://www.hmailserver.com/)) を経由して、メールデータを移行する方法があります。

## 失敗例: 受信トレイへドロップする

方法:

- `.eml` ファイルを `受信トレイ` へドロップする。

結果:

- 新規メールの作成画面が表示されて、`.eml` ファイルが添付されました。

![2021-12-14_12h33_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/30e2a601-d3c3-8af5-f5af-0d975e389c7f.png)

## 失敗例: フォルダーへドロップする

方法:

- `.eml` ファイルを `受信トレイ` 以外のフォルダーへドロップする。

結果:

- フォルダーにメールは追加されました。
- しかしプレビューには適さないようです。
  - プレビュー画面での表示: `このファイルのプレビューを表示できません。このファイル形式のプレビューアーがインストールされていません。`
  - ダブルクリックした際のプロンプト表示: `ファイルを開く前に、ファイルが信頼できる所からのものであることを確認してください。`

![2021-12-14_12h35_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/416789df-0a21-18d5-9804-f10c6f7f9282.png)

![2021-12-14_12h37_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/b5dad826-8ac3-da23-24e1-696d5ab56697.png)

# msg → eml ファイル

`msg` (Outlook が主に扱う) ファイルから `eml` (一般的なメーラーで扱う RFC822 形式) に変換する方法について検討します。

`pst` (Outlook が主に扱う) ファイルも出て来ますが「`pst` ファイルは `msg` ファイルが沢山入っているもの」と考えれば分かりやすいと思います。

(2024/08/15 追記)

3 層 (NDB 層 / LTP 層 / Messaging 層) 構造のデータベースです。参考:

- [pst-parser/README.md at f67ce44b586f54ca97979f77febef8e561bf04bf · IJMacD/pst-parser](https://github.com/IJMacD/pst-parser/blob/f67ce44b586f54ca97979f77febef8e561bf04bf/README.md#can-you-give-me-a-brief-very-high-level-view-of-the-layout-contents-structure-and-organisation-of-a-pst-file)
- [ruby-msg/README.md at 10994d9f5d580de62b8488e43b104ddedf37f7e8 · HiraokaHyperTools/ruby-msg](https://github.com/HiraokaHyperTools/ruby-msg/blob/10994d9f5d580de62b8488e43b104ddedf37f7e8/README.md)

(2022-11-21 追記)
`.msg` ファイルにはメール以外のデータ形式で格納している場合があるようです。具体的には連絡先、予定などです。
7-Zip などで `.msg` ファイルの中身を確認できるのであれば `__substg1.0_001A001E` をメモ帳で開くと MessageClass を確認できます。 `IPM.Note` であればメールです。
参考: [Item Types and Message Classes | Microsoft Learn](https://learn.microsoft.com/en-us/office/vba/outlook/concepts/forms/item-types-and-message-classes)
連絡先が格納されているのであれば msg → vcard 変換の方が適切と思われます。
予定が格納されているのであれば msg → iCal 変換の方が適切と思われます。 (2022/11/26 追記)


## ruby-msg 

[Google Code Archive - Long-term storage for Google Code Project Hosting.](https://code.google.com/archive/p/ruby-msg/)

紹介サイト

- [.msg を .eml に変換する (ruby-msg編）](https://blog.cles.jp/item/6664)

## mfcmapi 

[Releases · stephenegriffin/mfcmapi](https://github.com/stephenegriffin/mfcmapi/releases)

紹介サイト

- [How to save a mail into an .eml-file with Outlook? - Super User](https://superuser.com/questions/75581/how-to-save-a-mail-into-an-eml-file-with-outlook)

## libpst

[libpst Utilities - Version 0.6.76](https://www.five-ten-sg.com/libpst/)

紹介サイト

- [Searching and extracting data from PST files](https://dereknewton.com/2011/02/searching-and-extracting-data-from-pst-files/)