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

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

rentaru-mail

でその時に問題なるのはレンタルサーバーで受信したメールをどうやってこちらに移すか?
今回は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>&amp;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