自宅サーバーとレンタルサーバーでメールの同期を図る

私の環境は以下のようにレンタルサーバーと自宅サーバーそれぞれでメールを受信している
自宅サーバーは24時間動かしているわけではないため、自宅サーバーが電源OFFした場合はDynDNSのドメインのIPアドレスをレンタルサーバーに設定。逆に電源がONになった場合はその逆でドメインのIPを自宅サーバーへ向けるようにする。
つまりDNSを更新して現用系(自宅)と待機系(レンタルサーバー)でスイッチさせている

でその時に問題なるのはレンタルサーバーで受信したメールをどうやってこちらに移すか?
今回はsftpを使って同期する

userが対象のユーザ、hoge.netがレンタルサーバーのアドレスとする
#!/bin/bash

my_maildir=/home/user/Maildir/
{
cat << BAT
lcd ${my_maildir}tmp
-get Maildir/cur/*
-get Maildir/new/*
-rm Maildir/cur/*
-rm Maildir/new/*
exit
BAT
} | sftp -C \
-b - \
-oIdentityFile=/home/user/.ssh/dti_id_rsa \
-oPort=443 \
user@hoge.net > /dev/null 2>&1

cd ${my_maildir}/tmp
for i in $( ls ); do
dst=`echo $i | cut -d: -f 1`
if [ $i != $dst ] ; then
mv $i $dst
fi
chmod a+rw $dst
mv $dst ${my_maildir}/new
done

適当な解説
・sftpについて
sftpはバッチモードというのがあり、-bで指定してその後に命令の書かれたファイルを指定します。今回は標準入力から読み込むため-を指定。get rmはftpでおなじみのコマンドで、
最初に-がついてるのはエラーになっても続行すると言う意味です。(curなどにファイルが無い場合はエラーとなる)
ここら辺に具体的な説明が書かれていますが、-Pはポート指定では無いなどこちらの環境と少し違う箇所がありました。man sftpで見た方が良いかもしれません。

・Maildirのファイル名について
 命名の規約は下記参考リンクを参照するとして今回はレンタルサーバーにたまっていた物を新着メールとして処理したいので、ファイル名の:(コロン)以降を取り外しています。
ファイル名は以下のような構造になっています
1234567890.ABCDEFGHI123456789.hostname:2,S

1234567890 → UNIX時間
ABCDEFGHI123456789 → メールごとにユニークな識別文字
hostname → ホスト名
:2 → 普通は:2を指定してそれ以降に意味のあるフラグ文字を続ける
,S → この例だと既読の意味 Thunderbird上で捨てると,STとかフラグが追加される

参考にフラグの例を記載
* Flag "P" (passed): 転送とかしたときに付くらしい?
* Flag "R" (replied): そのメッセージに対して返信した場合につく
* Flag "S" (seen): 既読のメッセージ
* Flag "T" (trashed): 削除した場合につく
* Flag "D" (draft): 下書きを意味する
* Flag "F" (flagged): フラグ付きを意味する ThunderbirdだとスターをつけるとFがつく


参考リンク
http://www.dovecot.jp/wiki/MailboxFormat.Maildir.txt
http://cr.yp.to/proto/maildir.html