トップ  > サーバ設定:運用  > 各アプリケーションのインストール  > メールデータ移行

メールデータ移行  (最終更新日:2009/12/19)

メールサーバが受信したメールを格納する形式は種類があります。

  1. 共有ディレクトリ形式(/var/spool/mail/ユーザ名)という1つのファイルに全てのメールが格納されていく形式
  2. ホームMailbox形式(/home/ユーザ名/Mailbox)という1つのファイルに全てのメールが格納されていく形式
  3. Maildir形式(/home/ユーザ名/Maildir/newに新着メール、/home/ユーザ名/Maildir/curに既読メール、/home/ユーザ名/Maildir/tmpに配送中メール)というルールでメール1通を1ファイルとして格納されていく形式

sendmailでは、共有ディレクトリ形式をとっており、ファイルが破損すると全てNGになる点を考慮し、Maildir形式へ変更します。

ここでは、既に共有ディレクトリ形式またはホームMailbox形式でメールが格納されていることを想定し、全ユーザのメールデータをMaildir形式へ移行するようにします。

メールデータ移行

1.サービス停止
[root@sv ~]# /etc/rc.d/init.d/sendmail stop ← メールデータ移行中にメールを受け付けないようにする為
sm-clientを停止中:                                         [  OK  ]
sendmailを停止中:                                          [  OK  ]
2.Maildir変換ツール入手
[root@sv ~]# wget http://perfectmaildir.home-dn.net/perfect_maildir/perfect_maildir.pl -O /usr/local/bin/perfect_maildir.pl ← Maildir変換ツールダウンロード

[root@sv ~]# chmod +x /usr/local/bin/perfect_maildir.pl ← Maildir変換ツールへ実行権限付加
3.Maildir変換に必要なTimeDateモジュールのインストール
[root@sv ~]# yum install perl-TimeDate ← TimeDateモジュールインストール
4.Maildir一括変換スクリプト作成
[root@sv ~]# vi migrate-maildir ← Maildir一括変換スクリプト作成
ここから----------
#!/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 {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
----------ここまで
5.メールデータ移行

(1)現在の格納形式が「共有ディレクトリ形式」の場合

[root@sv ~]# sh migrate-maildir mbox ← Maildir一括変換スクリプト実行
実行結果は/tmp/migrate-maildir.logに保存されます。
例…Inserted 9 messages into maildir /home/user_m/Maildir/ in 0 seconds

(2)現在の格納形式が「ホームMailbox形式」の場合

[root@sv ~]# sh migrate-maildir Mailbox ← Maildir一括変換スクリプト実行
実行結果は/tmp/migrate-maildir.logに保存されます。
6.メールデータ移行後始末
[root@sv ~]# rm -f migrate-maildir ← Maildir一括変換スクリプト削除

[root@sv ~]# rm -f /usr/local/bin/perfect_maildir.pl ← Maildir変換ツール削除

sendmailのサービスを起動する前に、メール格納形式を変更すること。