2014年5月31日土曜日

Windows Live メールからMac Mail.appへのマイグレーション

移行アシスタントをなんとか使えるようにしてメールとかをmacに移行したにも関わらず、結局文字化けして使い物になりませんでした。

だめだめですね、移行アシスタント。

てなわけで、Windows Live メールからMail.appへのマイグレーションだいさくせ~ん!の開始です。

まずWebで調べるとThunderbirdを中継するのが鉄板な方法らしいです。

(1)WindowsのThunderbirdに「ImportExportTools」アドオンをインストール
(2)Windows Live メールでeml形式ファイルにエクスポート
(3)WindowsのThunderbirdにImportExportToolsをつかってインポート
(4)WindowsのThunderbirdでmbox形式にエクスポート
(5)macにmbox形式ファイルをコピーして改行コードをCRLFからLFに変換(tr -d \r)
(6)macのMail.appにインポート

一応、この方法試してはみたけど、それでもまだ文字化けが発生するメールが存在しました。
確認してみたら(3)の段階で文字化けしているメールがありました。
emlファイルの内容を確認したら、Content-Typeのcharsetにiso-2022-jpと指定していながら、本文がShift_JISなんていう、めちゃくちゃなものでした。

そういえば、昔のメーラーにはそんな愉快なメールを送信してくれるのも存在してたなぁ。
Windows Live メールとかOutlook ExpressとかはContent-Typeの指定なんか無視して表示していたから、なんら問題もなかったんだね。

てなわけで、Thunderbirdを使ったマイグレーション大作戦は大失敗に終わりましたとさ。

まぁ、これで終われたら楽なんだけど。

奥さんが「だんなさんなら何とかしてくれる!」なんて目で見るんです。

てなわけで、おうちで転がっているLinuxを使って、変換プログラムでマイグレーション大作戦りた~ん!です。普通のおうちにはLinuxなマシンなんて転がっていないと思うので、まったく転用が利かない話になってしまいますが。

さて、要はemlファイルからContent-type: charset="…"のを拾って、それに併せてnkfで変換してあげれば良いのです。
ついでに改行コードもLFにしてformailでmbox形式に変換までしちゃいましょう。的なタクティクスで。

で、作った変換スクリプトのソースが以下の通り。ちょっぴり長くなっちゃったけど。

---------------------------------------------------------
#!/bin/bash -f

#メール変換のメイン処理ループ
function mailconv_main() 
{
  # カウンター設定
  max=`ls *.eml|wc -l`
  cnt=1

  # ファイルがなければリターン
  if [ $max -eq 0 ] ; then
    return
  fi

  #出力mboxファイル名の設定
  arc="`pwd`".mbox
  rm -f "$arc"

  #カレントディレクトリemlファイル読み込み
  for item in *.eml
  do
    #ファイルが存在しなければ次のループへ
    if [ ! -f $item ] ; then
       continue
    fi
    opt=""
    #メールからContent-Type text/plain; charset=の行を取得
    contenttype=`perl -p -e 's/;\r\n//g' < "$item" | grep -i 'Content-Type:.*charset=' | head -1` 
    if [ ! -z "$contenttype" ] ; then
      #charsetの指定から文字コードを取得
      charset=`echo $contenttype | sed -e 's/.* charset=\(.*\)/\1/' | sed -s 's/"//g' | tr [A-Z] [a-z]`

      #文字コードに併せてnkfのオプションを設定
      if [[ "$charset" =~ utf-8 ]]; then
        opt="-w";
      elif [[ "$charset" =~ iso-2022-jp ]]; then
        opt="-j";
      elif [[ "$charset" =~ us-ascii ]]; then
        opt="-j";
      elif [[ "$charset" =~ iso-8859-1 ]]; then
        opt="-j";
      elif [[ "$charset" =~ shift_jis ]]; then
        opt="-s";
      elif [[ "$charset" =~ windows-31j ]]; then
        opt="-s";
      elif [[ "$charset" =~ cp932 ]]; then
        opt="-s";
      elif [[ "$charset" =~ euc-jp ]]; then
        opt="-e";
      else
        echo "Unknown Charset : $item : $contenttype : $charset"
      fi
    fi
    if [ -z "$opt" ] ; then
      # jis, shift_jis, utf-8に当てはまらない場合はjisを指定
      opt="-j"
    fi
    #変換対象の表示
    echo "$arc : $cnt/$max $opt"
    # nkfを使用して文字コードを変更 -m0を指定する
    nkf -m0 -Lu $opt $item | formail >> $arc

    #カウントアップ
    cnt=`expr $cnt + 1`
  done
  return 0
}

#カレントディレクトリ以下のディレクトリを検索
find . -type d | while read directory
do
  pushd "$directory"
  #変換メインをコール
  mailconv_main
  popd
done
---------------------------------------------------------
後は出来上がった*.mboxファイルをmacにコピーして、Mail.appでmbox形式のインポートをするだけっと。

とりあえず、奥さんのメール2万通ぐらい変換しても文字化するようなメールは見つかってないからこれで大丈夫かな。
macでもnkfをインストールすれば使えそうなきがするけど、どうなんだろう。
sedとかperlとかformailは使えるみたいだしね。
nkfの代わりにiconvを使うという手もあるだろうけど、iconvは文字の自動認識がないから難しいだろうなぁ。

【今日の結論】
nkfさまさまだね。

0 件のコメント: