結城です。
先日、Thunderbirdをお使いのお客さまから「旧PCから新PCにThunderbirdのユーザープロファイルを移行したところ、一部のメールフォルダーが重複して表示されるようになった」とお問い合わせを頂きました。
調査の結果、残念ながら詳細な原因の特定には至りませんでしたが、現象発生時の詳しい状況と回避策については明らかにできました。 そこで、同様の現象に遭遇された方向けに情報を公開したいと思います。
現象発生時の状況
聞き取りで明らかになった、具体的な不具合事象は以下のようなものです。
- 現象は特定の端末・特定のユーザーのみで発生しており、他のユーザー環境では再現していない。
- 現象は「ローカルフォルダー」アカウント配下のフォルダーで発生している。
- 重複して表示されているメールフォルダーは、内容が空になっており、他のメールフォルダーからメールをコピー・移動しようとしてもできない。
012ab84c
やdc987fe6
などのような文字列(16進数らしき物)の名前のメールフォルダーができている場合がある。- それらのフォルダーの中にも、内容が空になっていてメールのコピー・移動ができない物がある。
- 「フォルダーの修復」や「最適化」の操作を行っても状況が変化しない。
この中で、特に「フォルダーの修復」や「最適化」で現象が解消されないという点は重要です。
Thunderbirdのメールフォルダーは、「メールフォルダーの実体」と「要約ファイル(.msf)」の2つから成り立っています。 一般的に、1つのメールフォルダーには数百から数千件のメールが格納されることがざらにあり、すべてのメールを都度読み込んでいると処理に時間がかかり過ぎてしまいます。 また、通信回線が低速な環境ではあらかじめすべてのメールの本文をダウンロードしておくのが難しく、明示的に指示された段階で初めてメール本文をダウンロードする、という運用を可能にするためにも、メールの本文以外の情報だけを何らかの形で保存しておく必要があります。 そのような用途で使われているのが「要約ファイル」です。
「フォルダーの修復」は、この要約ファイルを作り直す操作です。 Thunderbirdは普段は要約ファイルに基づいてフォルダー内のメール一覧を表示する設計なので、要約ファイルの方が破損していると、仮にメールフォルダーの実体ファイルが無傷でも、このような現象が起こる可能性があります。 現在の要約ファイルを破棄して、メールの実体ファイルをスキャンし直し、その情報に基づいて要約ファイルを再作成する機能が「フォルダーの修復」です。
「最適化」は、メールフォルダーの実体ファイルを作り直す操作です。 Thunderbirdはメールの保存形式として、「個々のメール」と「メールフォルダー」の関係を「OSのファイルシステム上のファイル」と「OSのファイルシステム上のフォルダー」に対応させた「maildir形式」と、1つの「メールフォルダー」を1つの「OSのファイルシステム上のファイル」に対応させて1ファイルの中に多数のメール本文を保存する1「mbox形式」の2つに対応しています。 mbox形式では、メールを削除したり他のメールフォルダーに移動したりした時、メールフォルダーの実体ファイル内にあるメールの情報を削除せずに、「このメールは削除済みとして扱う」という印を付けるだけで済ませる2、いわゆる論理削除を行います。 これによって生じる「メールフォルダーの実体ファイルのサイズ」と「閲覧可能なメールのサイズ」の乖離を解消するために、削除済みとされたメールのデータをメールフォルダーの実体ファイルから取り除く機能が「最適化」です。 実際には、メールフォルダーの内容を全件スキャンして、「削除済みでないメール」だけを抽出して別のメールフォルダー実体ファイルを作成し、最後にメールフォルダーの実体ファイルを元の物と置き換える、という動作をするため、実質的には「メールフォルダーの実体ファイルの作り直し」となります。
このような事情があるので、フォルダー内のメールの一覧が表示されなかったり、メールの表示がおかしくなったりといった類の現象は、このどちらかの操作で解消されることが多いです。 そのどちらも効果がなかったということから、問題の深刻さが窺えます。
メールフォルダーの実体ファイルの状態
原因及び回避方法の調査のため、「旧PCから取り出されたThunderbirdのユーザープロファイル(移行前のプロファイル)」と「新PCでThunderbirdを起動して、現象が再現した状態のユーザープロファイル(移行後のプロファイル)」を送って頂き、内容を確認した所、以下の事が分かりました。
- 移行前のプロファイルには、不審な点は見当たらない。
- 移行後のプロファイルでは、「mbox形式のメールフォルダー実体ファイル」と「要約ファイル」のペアではなく、「実体ファイルに相当すると思しきフォルダー」と「要約ファイル」のペアがいくつか生じている。
- 例えば、
012ab84c
というmbox形式のファイルと012ab84c.msf
のペアがあるべき所が、012ab84c
というファイルシステム上のフォルダーと012ab84c.msf
のペアになっている。
- 例えば、
- この
012ab84c
といった名前のフォルダーが、ThunderbirdのUI上では05 高橋
のような普通の名前のメールフォルダーとして認識されている場合がある。- Thunderbirdはこのフォルダーについて「mbox形式のファイル」として読み込みを試みるが、その処理は当然失敗するため、「何らかの理由でmbox形式のファイルの内容を読み込めなかった」場合のエラー処理で回収される。ThunderbirdのUI上では、メールフォルダーの中身を読み取れなかったということで、空のメールフォルダーのように表示される。
- このような状態になってしまったメールフォルダーであっても、メールフォルダー自体を移動や削除すること自体はできる。これは、Thunderbird内部ではメールフォルダーの移動や削除が、ファイルシステム上のファイルの移動や削除として実装されており、対象がファイルでもフォルダーでも問題無く処理されるため。
- 移行前のプロファイルを使用して、手元の検証環境でThundebrirdを起動してみても、移行後のプロファイルと同様の状態にはならない。
- 新規プロファイルでThunderbirdを起動した上で、Thunderbird標準のインポート機能で移行前のプロファイルの内容をインポートした場合にも、移行後のプロファイルと同様の状態にはならない。
Thunderbirdのメールフォルダーのmbox形式の実体ファイルは、通常はメールフォルダーの名前と同じ名前になっています。
例えば、ThunderbirdのUI上で05 高橋
という名前のメールフォルダーを作成した場合、メールの保存先には05 高橋
という名前のmbox形式のファイルと、それに対応する05 高橋.msf
という名前の要約ファイルが作成されます。
ところが、受領した移行後のプロファイルでは、Thunderbird上のメールフォルダー名は05 高橋
なのに、実体ファイルの名前は012ab84c
になっている、といった形でメールフォルダー名と実体ファイル名が不一致である物がいくつか見受けられました。
本記事を書くにあたって追加の調査を行ったところ、この「メールフォルダー名と実体ファイル名の不一致」は、Thunderbirdの仕様上、正常な動作の結果生じうる状態であることが分かりました。 mbox形式で保存されているメールフォルダーの名前を変更するよう指示されたときに実行される処理の中では、まずファイルシステム上ファイル名に使用できない危険な文字が含まれているかどうかを確認して、そのような文字が含まれているか、もしくはファイル名が最大文字数(55文字)を超える場合、メールフォルダー名の代わりにハッシュ値をファイル名として使うようになっています。 ランダムな英数字文字列に見えた物は、実はこうして生成されたハッシュ値なのでした。 ただ、この時点ではここまでは調査が及んでおらず、「何らかの理由で、メールフォルダーに対応する実体ファイルが英数字の文字列の名前に変わる場合があるようだ」という事までが分かっている状態でした。
手元の検証環境では、移行前のプロファイルを使い回した場合もインポートした場合もそのような状況が発生しないため、この時点で現象の発生原因は掴めていませんでした。 通常は作成されることがなさそうな英数字の名前のフォルダーが、旧PCからのデータ救出直後にはまだ存在していなかったことまでは分かっていても、Thunderbirdを起動した直後の段階で発生するのか、それとも何らかのユーザーの明示的な操作がきっかけで発生するのか、それも分からない状況でした。
実際の現象発生環境での状況
以上の事を踏まえた最終手段として、お客さまのご了承を頂いた上で、実際に現象が発生している環境をお借りして、現象発生時の状況を確認させて頂くことにしました。 その結果、さらに以下のことが分かりました。
- 現象発生環境では、移行前のプロファイルを使用してThunderbirdを起動した場合も、新規プロファイルを作成して移行前のプロファイルからメールをインポートした場合も、一部のメールフォルダーについて以下のことが起こる。
- メールフォルダーの実体ファイルの名前が変更され、メールフォルダーと実体ファイルの名前が一致しない状態になる。
例えば、
05 高橋
というメールフォルダーに対応する実体ファイルの名前が、05 高橋
から012ab84c
のような英数字の名前になる。 - この時、元のmbox形式のファイル(例えば
05 高橋
)はそのまま残された状態で、変更後の実体ファイルの名前(例えば012ab84c
)のファイルシステム上のフォルダーが新たに作成され、要約ファイルの名前もそちらに追従する(例えば012ab84c.msf
。 - ThunderbirdのUI上では、
05 高橋
という名前のメールフォルダーが2つ表示される。- そのうち少なくとも片方は、格納されていたはずのメールがまったく表示されず、そのフォルダーへのメールのコピーや移動もできない状態になっている。
- メールフォルダーの実体ファイルの名前が変更され、メールフォルダーと実体ファイルの名前が一致しない状態になる。
例えば、
- そこからThunderbirdを再起動すると、UI上で、
05 高橋
のような名前のメールフォルダーと、012ab84c
のような名前のメールフォルダーの両方が存在する状態になっている。 - Thunderbirdを終了した状態で、
05 高橋
のような名前のmbox形式のファイルの名前を、05takahashi
のように英数字だけを含む(日本語の文字を含まない)物に変更して、それからThunderbirdを起動すると、Thunderbird上で05takahashi
のような(変更後のファイル名と同じ)名前のメールフォルダーとして見える状態になる。- この時、メールフォルダーを選択すると、中にあったメールは期待通りに一覧表示される。
- その上でThunderbirdのUI上でフォルダー名を
05 高橋
のように元の名前に変更すると、対応する実体のmbox形式のファイルの名前と要約ファイルの名前が012ab84c
と012ab84c.msf
のような英数字のみの名前に変わる。 この時、Thundebrird上ではメールフォルダーの内容にアクセスできる状態が保たれている。
その上で、何度かの試行の結果、以下の事がさらに明らかになりました。
- 現象発生環境ではなぜか、一部の日本語の文字が「ファイル名に使用できない文字」として扱われている模様である。
- 調査時に簡単に確認しただけでは、NTFSでフォーマットされたストレージであるという事までしか分からなかった。
- 現象発生環境で「ファイル名に使用できない文字」扱いとなっている文字を含む実体ファイル名のメールフォルダーについて、Thunderbirdの起動処理またはインポート処理のどこかの時点で実体ファイルの名前が変更されるときに、なぜか「ファイル名の変更」ではなく「変更後の名前でファイルシステム上のフォルダーが作られる」結果になっている。
- 手元の検証環境との最大の差異はこの点である。
- 現象発生環境で「ファイル名に使用できない文字」扱いとなっている文字を含まない実体ファイル名のメールフォルダーについて、Thunderbirdが起動した後で手動操作でメールフォルダーの名前を変更した場合は、この「実体ファイルの名前は変わらずに、ファイルシステム上のフォルダーが作られる」現象は起こらない。
当方検証環境やお客さまの他の環境ではこの現象が起こっていないこと、現象再現時に問題となった文字がファイル名に使用できない文字の定義に含まれてはいないように思われる3ことから、なぜ当該環境でのみ現象が発生するのかは不明でしたが、ともかく、発生条件が掴めたことは大きな前進です。
暫定的な回避策
ここまでで分かったことをまとめると、暫定的な回避策が見えてきました。 ユーザープロファイルの移行時に以下の手順を経れば、実用上は移行前と同じ状態を取り戻せると考えられます。
- 旧PCから新PCへユーザープロファイルを持ち込む。
- Thunderbirdを起動するよりも前に、持ち込んだプロファイル内のメールの保存先フォルダー内から、日本語の文字を含む名前の実体ファイルを探し、見つかったファイルのすべてについて、実体ファイルと、ペアになっている要約ファイルの両方の名前を、英数字のみの安全な名前に一旦変更する。
- そのプロファイルを使って、新PC上でThunderbirdを起動する。
- 先程実体ファイルの名前を変えたメールフォルダーそれぞれについて、メールフォルダー名が実体ファイルと同じ(安全な名前)になっているので、ThunderbirdのUI上でメールフォルダー名を変更して元の名前に戻す。
もし移行後のユーザープロファイル(新環境でThunderbirdを起動してしまい、メールフォルダーの重複などの状況が発生してしまっている状態)しか残っていない場合には、メールフォルダーがまったく別の名前に変化してしまっていたり、データが消失してしまったりしている恐れもあります4。
一切のデータロスを避けるためには、移行前のユーザープロファイルを使って上記手順を実施する必要があります。 このような事例があるため、Thunderbirdのデータ移行では、移行後の環境で正常な動作を得られるようになった事を確認するまでは、移行前のユーザープロファイルは完全には消去しないことを強くお勧めします。
この回避策を実施して頂いた所、お客さま環境においては、運用上支障が無い状態となった様子でした。
暫定的な回避策が通用しない例外
前項の回避策の実施後の追加の問い合わせとして、元々のフォルダー名が下書き-address@example.com
や送信済みメール-address@example.com
などのようになっていたいくつかのメールフォルダーで、「ThunderbirdのUI上でメールフォルダー名を変更して元の名前に戻す」操作を行えない、というお問い合わせを頂きました。
これらのフォルダーの名前を変更できないという制限は、Thundebrirdの仕様に起因しています。
- Thunderbirdのメールフォルダーの中には、
受信トレイ
送信トレイ
送信済みトレイ
下書き
などの名前を変更できない特殊なものがいくつかある。- これらの特殊なメールフォルダーは、実体のファイル名が
Inbox
Unsent Messages
Sent
Draft
となっているのが、UI上でのみThunderbirdの表示言語に合わせた名前で表示されるようになっていて、その都合でユーザーによる任意の名前変更を受け付けない。
- これらの特殊なメールフォルダーは、実体のファイル名が
- Thunderbirdでは、特定のメールアカウントで受信したり送信したりしたメールの保存先を、
アカウント設定
→(特定のメールアカウント)→送信控えと特別なフォルダー
の設定項目を編集して、「ローカルフォルダー」アカウント配下など別のアカウントのメールフォルダーに指定することができる。- ここで指定した先のメールフォルダーは、特殊なメールフォルダーと同じ扱いになり、それ以後は名前を変更できなくなる。
- 別のメールフォルダーを選択し直した後も、この状態は維持される。
- Thunderbirdを再起動すると、この特殊なメールフォルダー扱いは解除され、以後は名前を変更できる状態に戻る。
現象が起こっている環境のメールアカウントの現在の設定では、当該メールフォルダーは別のメールアカウントの特殊メールフォルダーには設定されていないようでしたが、要約ファイルやキャッシュなど何らかの箇所に特殊メールフォルダーとしての状態が残留している様子でした。 以下の手順を踏むことで、特殊メールフォルダーではなく通常のメールフォルダー扱いに戻すことができ、名前を変更できる状態に戻りました。
- ThunderbirdのUI上で名前を変更できない状態になっているメールフォルダーについて、他のメールアカウントの特殊なメールフォルダー扱いになっていないかどうかを確認する。 もしなっていれば、一旦別のメールフォルダーを選択し直す。
- 当該メールフォルダーのプロパティーを開き、実体ファイルの名前を確認する。
- Thunderbirdを終了する。
- 当該メールフォルダーの実体ファイルに対応する要約ファイルを削除する。
- 当該メールフォルダーの実体ファイルの名前を、英数字のみの安全な別の名前に一旦変更する。
- Thunderbirdを起動し、当該メールフォルダー(先の手順で変更した後の名前になっている)の名前を、元々想定していた名前に戻す。
実体ファイルと要約ファイルの名前を同時に変更して要約ファイルを引き継いだり、実体ファイルの名前を「そのメールフォルダーが特殊なメールフォルダーとして認識されていたときの実体ファイル名」から変更しないままだったりすると、メールフォルダーの特殊メールフォルダー扱いは解除されない模様です。 必ず「要約ファイルの削除」と「実体ファイル名の変更」の両方を実施するようにご注意下さい。
まとめ
Thunderbirdのユーザープロファイルを別のPCから引き継いだ際に起こる事があるメールフォルダーの重複などの異常動作について、お問い合わせから暫定的な回避策の特定までにあったことを紹介しました。
今回お問い合わせを頂いたトラブルについては、類似の問い合わせ事例が過去になく、当方の検証環境でも再現はできませんでした。 また、実際の再現環境での調査時間が限られていたことから、なぜその環境でのみ現象が発生するかの原因の完全な特定にも至らないままとなってしまいました。 すっきりとはしない結末となってしまいましたが、もし同様のトラブルでお悩みの方がおられれば、参考になれば幸いです。
当社では、Thunderbirdの法人運用におけるトラブルについて、原因や回避策の調査を有償にて承っております。 Thunderbirdの運用でお悩みの企業のご担当者さまは、お問い合わせフォームよりご相談ください。
-
つまり、複数のメールのデータを連結したものを「メールフォルダー」のファイルとするということ。 ↩
-
実際には、個々のメールのデータのヘッダー領域部分にある特定のbitを置き換える。 ↩
-
ソースコードを見た限りでは、パスの区切り文字として使われるような記号類と、いわゆる制御コードの類のみが、ファイル名に使用できない文字扱いとなっているようです。 ↩
-
今回の調査では、移行後のユーザープロファイルとして受領した物は「移行してメールフォルダーが重複するようになった後、ユーザー自身が試行錯誤して、重複フォルダーの移動や削除などの操作を色々行った結果、移行直後の状態から大きく離れてしまった物」であったことと、実際の再現環境での調査時間が限られており現象発生時の影響を完全には調べきれなかったことから、どのようにすれば元の状態を復元できるかについては明らかにできていません。 ↩