りなざうの標準メーラで保存していたメールデータを、G-mailに移管した作業の備忘録

id:osshy:20130223:1361608662の詳細。

概略

LinuxZaurus SL-C1000の標準メーラで持っていたメールデータをzdbatでCSV化、添付ファイル群共々PCにコピーし、Cygwin上でgawkスクリプトでEMLに変換(スクリプト中でnkfbase64等のコマンドを使用)、ThunderbirdでG-mailにIMAP転送。

まず、りなざうでの作業

  1. zdbatインストール(LinuZau ToolBox Wiki - zdbat
  2. zdbatで、全てのメールデータの全フィールドCSVを作成
    • (本体メモリ、SDカード、CFカード)×(inbox、outbox)で計6ファイル。
    • 出力文字コードEUC(デフォルト)
    • JISは、「、」が「!」+「,」になる為、後のgawkでのFS=","で引っかかってしまうので不可
      • JIS以外ならなんでも良いが、utf8はファイルサイズがでかくなるため後のgawkでの処理が重くなるので、避けるが吉
  3. zdbatで、全てのメールデータのENNM、ENFLの2フィールドのみのCSVを、utf8で作成
    • やはり計6ファイル
    • CARDID、CATEGORYの2フィールドは必ず出力されるので、正確には4フィールドのCSV
    • ENNMは添付ファイル数、ENFLはsaveされた添付ファイルのフルパス名
    • りなざうファイルシステムが日本語ファイル名にutf8を使用しているので、ENFLもutf8で出しておく方が楽チン
  4. 上記の4フィールドCSVから添付ファイル名を抽出し、それらを1ディレクトリにcp
    • フルパス表記なので、パス構成も含めてcp
      • 即ち、「/usr/aaa/bbb/ccc.jpg」→「hogehoge/usr/aaa/bbb/ccc.jpg
  5. 全フィールドのCSVと、添付ファイル群のcp先ディレクトリ丸ごとを、PCにcp

以下、PCのCygwin環境上で作業

  1. CSVを読んで、添付ファイルも取り込んだEMLを出力するgawkスクリプトを作成・実行
    • 「複数行に亘る1フィールドを含む、カンマ区切りなレコード」を扱うために、FS、FPAT、RS変数を使用している
      • 従ってgawk 4.0.0以降が必要
      • RS変数は、CSVのDMMYフィールドがMessage-Id・In-Reply-To・Referenceである事を利用した
    • awk内で使用しているコマンド
      1. [
      2. base64
      3. date
      4. md5sum
      5. nkf
      6. od
    • あぶのーまるなトコ
      • zdbatの問題なのか、元のZaurus DataBase起因なのかは不明だが、zdbatで得られたCSVは、以下の様な問題を含んでいた
        • 送信メールのレコードで、受信したメールに対する返信であった場合、HTMLとDMMYフィールドには元の受信メールのデータが入ってしまっている
        • 返信ではない送信メールのレコードには、HTML、DMMYともにデータが無い(DMMYは、ヘッダのレコード名のみでその値が無い)
      • 送信なので、HTMLはそもそも不要で、含まれる場合は捨てれば良い
      • 問題はDMMY、即ち、Message-Id・In-Reply-To・Referenceである
        • 受信メールに対する返信メールとする為には、
          • 送信メールにMessage-Idの値がある場合、その値は実は返信する受信メールのIdなので、送信メールにあってはIn-Reply-Toになるべき
          • 送信メールにIn-Reply-Toの値がある場合、その値は実は返信する受信メールが返信したメールのIdなので、送信メールにあっては上記Message-Idの値に変更されるべき
          • 送信メールにReferencesの値がある場合、その値は実は返信する受信メールが返信したメール以前のスレッドのIdなので、受信メールに対する返信である送信メールにあっては、上記Message-Idの値を追加した内容に変更されるべき
        • そして残念な事に、以下の仕様にならざるを得ない
          • 送信メールは基本、Message-Idは判らない
    • その他
      • 送信メールの場合、「X-Mailer: sharp pda mailer/5.4[ja](SL-C1000/1.0)」を出力(笑)
  2. 出来たEMLをThunderbirdでG-mailにIMAP転送
    • 省略

おわりに

900行超のawkスクリプトを書く羽目になり、我ながら阿呆と思う。多分PerlならCPANCSV読み込み、MIMEフォーマット出力、なんかがあるんだろうけど、Perlは食わず嫌いで覚えなかった。ま、FPAT、RSを工夫した事で、「レコードデータをレコードオリエンテッドなツールでレコード単位に処理した」辺りで自己満足を味わえた、という事で良しとしよう。