メールデータ形式の移行



●概要

 メールサーバーが受信したメールを格納する形式には、以下のものがあります。

・共有ディレクトリ形式(「/var/spool/mail/ユーザ名」というファイルに全てのメールが蓄積されていく形式)
・ホームMailbox形式(「/home/ユーザ名/Mailbox」というファイルに全てのメールが蓄積されていく形式)
・Maildir形式(「/home/ユーザ名/Maildir/new」というディレクトリに新着メール、/home/ユーザ名/Maildir /cur」というディレクトリに既読メール、/home/ユーザ名/Maildir/tmp」とい うディレクトリに配送中メールを格納し、各ディレクトリ内でもメール1通を1ファイルとして管理する形式)

 Linuxのデフォルトメールサーバーであるsendmailのメール格納形式は共有ディレクトリ形式ですが、アクセス性能改善及びセキュリティ強化の観点からMaildir形式へ移行します。
 ここでは、既に共有ディレクトリ形式または、ホームMailbox形式によるメールサーバーを運用中の場合を想定し、全ユーザのメールデータをMaildir形式へ移行するようにします。

●メールサーバー停止

 メールデータ移行中にメールを受け付けないようにするため、現在稼動しているメールサーバーを停止します。

・sendmailの場合
# /etc/rc.d/init.d/sendmail stop
・Postfixの場合
# /etc/rc.d/init.d/postfix stop
・qmailの場合
# /etc/rc.d/init.d/qmail stop

●メールデータ移行

・Maildir変換ツール入手
 Maildir変換ツールダウンロード
# wget http://perfectmaildir.home-dn.net/perfect_maildir/perfect_maildir.pl -O /usr/local/bin/perfect_maildir.pl
# chmod +x /usr/local/bin/perfect_maildir.pl <−− Maildir変換ツールへ実行権限付加

・Maildir変換に必要なPerlのTimeDateモジュールインストール
# yum -y install perl-TimeDate
・Maildir一括変換スクリプト作成
# vi migrate-maildir.sh
 以下が、その内容です。
#!/bin/bash
#
#Maildir一括変換スクリプト
#
#メールボックス=>Maildir形式変換スクリプト
#http://perfectmaildir.home-dn.net/
FOLDERCONVERT=/usr/local/bin/perfect_maildir.pl
#一般ユーザリスト
USERLIST=`ls /home/`
#ログ
MIGRATELOG=/tmp/migrate-maildir.log
rm -f $MIGRATELOG
#引数(変換元メールボックス形式)チェック
if [ "$1" != "mbox" ] && [ "$1" != "Mailbox" ]; then
    echo "Usage: migrate-maildir.sh {mbox|Mailbox}"
    exit
fi
#一般ユーザメールボックス移行
for user in $USERLIST;
do
    if [ "$1" = "mbox" ]; then
        inbox="/var/spool/mail/${user}"
    else
        inbox="/home/${user}/Mailbox"
    fi
    if [ -f "${inbox}" ]; then
        newdir="/home/${user}/Maildir/"
        mkdir -p "$newdir"
        mkdir -p "$newdir"/cur
        mkdir -p "$newdir"/new
        mkdir -p "$newdir"/tmp
        chmod -R 700 "${newdir}"
        $FOLDERCONVERT "$newdir" < "${inbox}" >> $MIGRATELOG 2>&1
        chown -R ${user}. "$newdir"
        find "$newdir" -type f  -exec chmod 600 {} \;
    fi
done
#rootユーザメールボックス移行
user="root"
if [ "$1" = "mbox" ]; then
    inbox="/var/spool/mail/${user}"
else
    inbox="/${user}/Mailbox"
fi
if [ -f "${inbox}" ]; then
    newdir="/${user}/Maildir/"
    mkdir -p "$newdir"
    mkdir -p "$newdir"/cur
    mkdir -p "$newdir"/new
    mkdir -p "$newdir"/tmp
    chmod -R 700 "${newdir}"
    $FOLDERCONVERT "$newdir" < "${inbox}" >> $MIGRATELOG 2>&1
    chown -R ${user}. "$newdir"
    find "$newdir" -type f  -exec chmod 600 {} \;
fi
[ -a $MIGRATELOG ] && cat $MIGRATELOG;rm -f $MIGRATELOG
・メールデータ移行(共有ディレクトリ形式→Maildir形式)
 現在のメールボックス形式がデフォルトの「/var/spool/mail/ユーザ名」の場合
sh migrate-maildir.sh mbox <−− 一括変換スクリプト実行
Inserted X messages into maildir /home/XXXXXXXX/Maildir/ in 0 seconds
・
・
・
Inserted X messages into maildir /home/XXXXXXXX/Maildir/ in 0 seconds
・メールデータ移行(ホームMailbox形式⇒Maildir形式)
 現在のメールボックス形式が「/home/ユーザ名/Mailbox」の場合
# sh migrate-maildir.sh Mailbox <−− 一括変換スクリプト実行
Inserted X messages into maildir /home/XXXXXXXX/Maildir/ in 0 seconds
・
・
・
Inserted X messages into maildir /home/XXXXXXXX/Maildir/ in 0 seconds
・メールデータ移行後始末
# rm -f migrate-maildir.sh <−− Maildir一括変換スクリプト削除
# rm -f /usr/local/bin/perfect_maildir.pl <−− Maildir変換ツール削除
※メールデータ移行後は、メールサーバーのメール格納形式をMaildir形式へ移行すること。
※メールデータ移行後メールサーバー再起動後したにもかかわらず、/var/spool/mail/ユーザ名」にメールが保存されてしまう場合、「全ユーザ共通設定」及び「ユーザ毎の設定」を参照して「/etc/procmailrc」を設定してください。

●メールサーバー起動

 メールデータ移行の際に停止したメールサーバーを起動します。
・sendmailの場合
# /etc/rc.d/init.d/sendmail start
・Postfixの場合
# /etc/rc.d/init.d/postfix start
・qmailの場合
# /etc/rc.d/init.d/qmail start