古いメールの回復

条件がいろいろ違う

発掘した場所,元の時代などによっていろいろメールファイルの形態(ヘッダーに含まれる情報や型式,文字コード等)が違いますので,なかなか一筋縄ではいきません.

一応,昔の発掘したメールファイルの回復方法を書いときます.最終的には手作業で,メールヘッダー部分を修正する必要があることが多いです.

取り出して一通ずつ切り分ける

まず,何とかして取り出して,一通ずつに切り分けます.どこからもってくるかによって全部つながっていたり,個別に分かれていたりしますね

メールが数百とかある場合は,Perlスクリプトなどで処理するのが現実的ですね.

文字コードをUTF-8に整える

文字コード変換が必要な場合,扱うOSでネイティブな文字コードに変換してしまうのが楽です.わたしの場合は,MacとLinux + KDEが主なので,迷わずUTF-8です.

nkfを使うか,Kateなどの高機能エディターでUTF-8にします.数が多い場合は,bashでnkfを連続で回すのが良いでしょうね.

ヘッダーを整える

文字コードを変換した場合,ヘッダーの当該部分を,

Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 8bit

にします.数が多ければsedを使うのがよいでしょう.

なお,比較的新しいメールについては,ヘッダー内のタイトル(Subject)はMIME化されていて,また,本文の文字コードと,ヘッダーの上記部分の整合性もいいので,文字コード変更(とそれに伴うヘッダー修正)は行わない方が良いです.

ヘッダーの修正

文字コード以外のヘッダーの修正が必要なことが多いです.

一番引っかかる(IMAPクライアントのヘッダー解析でエラーになってしまう)のが,

>From だれそれ

というヘッダーです.これは,ざっくり削除しました.

sed -i '/^>From /d' *

(Mac OS X付属のsedは,GNU sedではないようで,上記の方法はNGです.)

ただし,手持ちの古いファイルの一部は,このヘッダーのみに日時が含まれている(「だれそれ」の後に付いている)ので,これをDate:行に書き換える必要がありました.

できたファイルをThunderbirdで読み込む

できたファイルの拡張子は,”eml”にします.

IMAPのサーバーでも良いし,ローカルでも良いので空のフォルダーを,Thunderbirdで作ります.そこへ(Thunderbirdへ),整えたemlファイルをdrag & dropします.

確認して必要ならば修正

読み込んだメールの日時やタイトル,本文を確認して,うまくいってなければ個別に文字コードやヘッダーを修正して再度読み込ませます.

Thunderbirdが依然としてエラーを出すヘッダーのあるemlについては,emlをuploadした直後に,downloadに失敗します(uploadはノーチェックのようです)ので,小分けにして読み込ませるのが良いようです.

制限

このようにして,Thunderbirdでは,エラーなく復活できたメールを正常に相手,日時,タイトルなどをリスト表示できて,本文の表示もできます.

いっぽうで,このようにThunderbirdからIMAPサーバーにuploadしたメールについて,Mac OS Xの”Mail”や,iPhoneなどのiOSの「メール」でアクセスすると,リストには日時が正常に表示されず,Thunderbirdでemlをuploadした日時が表示されるものがあります.また,リストには「本文がありません」と表示されるものもあります.

この,Mac OS Xと,iOSのMailでのリスト表示の不具合はなんとも不可思議で,同じように処理したつもりでも,リストに日時が正常に表示されるものと,uploadの日時になってしまうものがあります.両者のヘッダーを穴の開くほど眺めましたが,違いが分かりませんでした.

内容表示は正常なのでよしとします.時間順が重要な場合は,Thunderbirdで読むことにします.

効能^^;

この方法でかなり多くのメールを復活させました.2000年前後が主ですが,1994年頃のものもあります.

この人とは,この頃こういう交流をしていたのだ,などと懐古しています^^;

亡くなった先輩とのメールなど読み返すと,いろいろ思うところがあります.仲の良い先輩で,ある意味友だち付き合いしていました.あんまり失礼な書きぶりがなくてほっとしています.

Eudoraのメールファイル,UW-IMAPサーバーのユーザーディレクトリー内のファイルは,一続きでした.

Slackwareのbuildスクリプトのバグ発見

UW IMAPは,make時にIP=6を与えないといけないのです.

普通は,configure時のオプション設定で,そうした設定をして足りるんですが,たまにこういうオレ流なパッケージがあります.

Slackware-currentのalpine.Slackbuildですが,

# Build and install:
# Since we build non-compliant to RFC3501 we have to answer 'y' half-way:
echo y | make EXTRACFLAGS="-fPIC" SSLTYPE=unix || exit 1

# Build and install:
# Since we build non-compliant to RFC3501 we have to answer 'y' half-way:
echo y | make EXTRACFLAGS="-fPIC" SSLTYPE=unix IP=6 || exit 1

にしないと,IPv6サポートになりません.

そう,これだけのこと^^; オレの週末を返せぇ!

Slackware付属のIMAPデーモン(サーバー)が,IPv6で使えない問題の解決策の話です.

UW IMAPのIPv6解決

光明をたどったんですが,芳しくありませんでした.IPv6+SSLのパッチが当たったというRedhat系のrpmのソースをいろいろいじっていましたが,IMAP部分だけではbuildできません

そこで,Slackwareに戻って,Slackware-currentにあるalpine-2.20について,コマンドを受け取るルーチンに,受け取ったコマンドをログに書き出すように細工して確認したところ,IPv6だと,文字化けして受け取っています.たとえば,こんな感じです.

Feb 28 12:43:54 je1sgh imapd[1807]: Slurp input (dump): ^V^C^A^B

ですが,それが解っても,これ以上はどうしようもありません.

一つ腑に落ちないのが,Slackwareで使用している,alpine-2.20というソースの出所が見つからないのです.UW IMAPを引き継いだPanda IMAPとかいうプロジェクトらしいんですが.

もうあきらめようと思って,ダメ元でUW IMAPのサイトにある,alpine.tar.bz2をbuildしてみました.展開すると,alpine-2.00というディレクトリーに展開されます.バージョン番号から,Slackwareのものよりずいぶん前のものと推測され,期待薄です.

ところが,buildしてimapdだけコピーしてみると,なんと,全く問題なくIPv4, IPv6のどちらの接続も受け付けます.

なんだったんでしょう^^;

imap-ssl-ipv6

少なくとも,Slackware-14.1, -currentのIMAPサーバーはぶっ壊れています.

追記

その後の調べで,Alpine 2.20のソースでもOKです.パッチを当てずにオーソドックスにbuildしてできたimapdを/usr/sbinに置けばちゃんと動きます.

しかし,どうしたわけか,alpine.Slackbuildでbuildすると,だめです.alpine.Slackbuildも,imapdにはパッチを当ててないんですが.

また,上記のalpine-2.00もalpine.Slackbuildでbuildすると,IPv6を受け付けなくなります.

できれば,原因を解明して,Slackwareの開発者にフィードバックしたいのですが,全く解りません^^;

解決

Slackwareの問題点解りました.ただし,開発者への連絡法が解りません^^;

また,RPM系はどういうわけか,shared libraryにこだわっていて,関連ライブラリーなどをsharedとしてインストールしなければなりません.はまり始めると,底なしの依存性地獄に陥るでしょう^^;
slurpというサブルーチン.
configureのオプション,makeのオプションは,はalpine.Slackbuildを参照.

UW IMAP見えてきました

まずはpatchを探すということで,取り組み始めたら,RPMのパッケージの修正記録に,

* Tue Apr 27 2010 Rex Dieter <rdieter@fedoraproject.org> - 2007e-11
 - SSL connection through IPv6 fails (#485860)
 - fix SSLDIR, set SSLKEYS

というのがあるのを見つけました.

やっぱりそうなんです.SSL接続するときにはIPv6が使えないのです.IMAPアクセスするのに,SSL接続しないなんてことは,普通は考えられないのですが.

ということで,一条の光明が見えました.昼飯担当なので,午後,昼寝を返上して取り組みたいと思います^^;

IMAPサーバーの方針

ということで,IMAPサーバーのIPv6化について,一応方針が固まりました.まずは,UW IMAPのIPv6対応パッチがないか探してみます.これは,期待薄ですが.それでなければ,IPv6に対応しているとうたわれているCourier IMAPに乗り換えます.

Courier IMAPは,UNIX/Linuxのレガシーなmboxではなく,Maildirという各ユーザーのホームディレクトリー内にあるサブディレクトリーにメールを保存する方式だそうで,これを導入するためには,届いたメールをsendmailから受け取るローカルMDAと,CUIのメールクライアントソフトもMaildir対応のものに更新しなければなりません.

特に,ローカルMDAの切り替えは,sendmail.cfの書き換えを要しますので,失敗したり,切り替え作業時に届いたメールを永久に紛失してしまうことがあり得ますので,慎重に行わなければなりません.

現在プロバイダーの切り替えが完了してしなくて,これから,重要な連絡メールが届く予定もあり,実施すべきではありません.

ということで,逆に時間的に余裕があるので,じっくり取り組みたいと思います.