Virtualmin(Webmin)でメールデータをmboxからMaildir形式に移行する(CentOS5、Postfix)

CentOS 5でPostfixのメールデータをmbox形式からMaildir形式に変換する場合、こちら(メールデータ移行 – CentOSで自宅サーバー構築)のとおりで基本的には移行できるのですが、Virtualminを入れてバーチャルメール環境にしてある場合、Maildir一括変換スクリプトがこのままだと完全には働いてくれません。

なぜかというと、Virtualminが作るメールユーザーフォルダは、/home/{ユーザ名} ではなく、/home/{シェルユーザ名≒group}/[domains/{ドメイン名}/]homes/{メールユーザ名}/ という形式だからです。

もっと詳しく言うと、「Add new virtual server, owned by: <New user>」で作った最初のバーチャルサーバー(例:ユーザ名:example1user、ドメイン名:example.comとする)のメールユーザー(例:example1mail@example.com)の場合、メールユーザーフォルダは、
/home/example1user/homes/example1mail
となり、example.comの設定中の「Create Sub-Server」でサブサーバー(example2.com)を作り、メールユーザーを作った(example2mail@example2.com)場合は、
/home/example1user/domains/example2.com/homes/example2mail
というふうになります。

ですので、Maildir一括変換スクリプトを以下のように改編。無事移行することができました。
多少強引でスマートでないですが、一時的なものだし…ということでご容赦。

なお、これをやる時はメールサーバ(Postfix)を停止しておくことと、移行後に /etc/postfix/main.cf の
home_mailbox = Maildir/
の行を有効にしておく(コメントアウトを削除、または追記する)ことと、/etc/dovecot.conf に
mail_location = maildir:~/Maildir
を有効にしておくことが必要です。
(ちなみにどちらもWebminからできます。
Postfixは、サーバ→Postfix の設定→ローカル配信→ユーザ メールボックス ファイルのホーム相対パス名 を Maildir/ にする。
Dovecotは、サーバ→Dovecot IMAP/POP3 Server→Mail Files→Mail file locationを Inbox and folders in ~/Maildir にする。)

#!/bin/bash
#
#Maildir一括変換スクリプト
#

#メールボックス=>Maildir形式変換スクリプト
#http://perfectmaildir.home-dn.net/
FOLDERCONVERT=/usr/local/bin/perfect_maildir.pl

#ログ
MIGRATELOG=/tmp/migrate-maildir.log
rm -f $MIGRATELOG

#引数(変換元メールボックス形式)チェック
if [ "$1" != "mbox" ] && [ "$1" != "Mailbox" ]
then
    echo "Usage: migrate-maildir {mbox|Mailbox}"
    exit
fi

#一般ユーザメールボックス移行
VMUSERS=`cut -d: -f1 /etc/passwd | grep "@"`
for user in $VMUSERS;
 do
    username=`echo ${user} | cut -d@ -f1`
    domain=`echo ${user} | cut -d@ -f2`
    group=`groups ${user} | cut -d: -f2 | sed 's/^ //' | sed 's/ *$//'`

    if [ "$1" = "mbox" ]; then
        inbox="/var/spool/mail/${user}"
    else
        exit
    fi

    if [ -f "${inbox}" ]; then
        userdir="/home/${group}/domains/${domain}/homes/${username}/"
    if [ -e "${userdir}" ]; then
        userdir=$userdir
    else
        userdir="/home/${group}/homes/${username}/"
    fi
#        echo "$user		$userdir"
        newdir="${userdir}/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
exit

#編注:以下必要でしたら実行してください。
#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

Leave a Reply