2021/08/29 RockyLinux8.5





メールサーバのMBox形式をMailDir形式へ変換

メールボックスの形式を、MBoxからMailDirへ変換します。
別項「ActiveDirectoryと連携するメールサーバ(SSSDとMBox)」で、もうMBox形式で詰んだ場合とか、MailDirへ変更することで回避できます。

具体的には変換のPerlスクリプトが配布されているので検証してみました。
有名どころでは2種類

Mb2md
Perfect_maildir

どちらもPerlスクリプトなのですが、デフォルトでは入っていないPerlモジュールを使用するので、このためだけに少しPerl環境を設定する必要があります。


1.perl環境の準備
2.事前作業
3A Mb2mdを使用して変換
3B Perfect_maildirを使用して変換
4.事後作業
5.補足

Perl環境の設定
どちらの変換スクリプトも、実行すると以下のようなエラーが出ます。
日付関連のモジュールが入っていない、というメッセージです。
こいつのインストールはちょっと骨が折れます。
もうPerlモジュールがインストールされている環境なら、この手順はスキップできます。
[root@mailsv mail]# perl ~/perfect_maildir.pl /var/mail/maildir/user1 < user1
Can't locate Date/Parse.pm in @INC (you may need to install the Date::Parse module) (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5) at /root/perfect_maildir.pl line 22.
BEGIN failed--compilation aborted at /root/perfect_maildir.pl line 22.
もしメールサーバが直接ネットに通信できない場合、環境構築は難しいので別サーバでの変換を検討しましょう。

perlのDate::Parseモジュールが必要なのですが、インストール中に依存が足らなくて止まります。
開発環境をインストールします。
#yum groupinstall "development tools"

perlのモジュールインストールツールcpanのインストール。
DateTime関連のモジュールをインストールを開始しますが、これが非常に時間がかります。
#yum install cpan

#cpan
Would you like to configure as much as possible automatically? [yes] yes

cpan[1]> install DateTime  (時間がかかります)
cpan[2]> intall Date::Parse  (目的のモジュール)
cpan[3]> q
DateTimeのインストールにあまりに時間がかかってしびれを切らし、インストールが完了していないうちに別のセッションから以下のコマンドを実行すると、モジュールインストールできました。
時間が足らないときにどうぞ。
cpanがある程度インストール進行してから、別のSSHセッションで
#cpan Date::Parse


事前作業
移行のために、メールサーバを停止します。
#systemctl stop postfix
#systemctl stop dovecot
同じディレクトリの中に同じ名前のファイル(MBox)とディレクトリ(変換後のMailDir)は共存できないため
/var/mailの中に一時ディレクトリを作成します。
#mkdir /var/mail/maildir
変換時点ではオリジナルのメールファイルに手を付けていないため、変換失敗時にメールサーバの切り戻しを素早くできます。


ここから、「Mb2mdを使用して変換」か「Perfect_maildirを使用して変換」のいずれかを選択します。
面倒がないのはMb2mdのほうですが、メール内容によっては変換エラーが発生するかもしれません。
2段構えのほうがいいでしょう。


Mb2mdを使用して変換
事前作業は終わっているものとします。

Mb2mdのスクリプトを配布元から入手します。
Downloadのリンクから、ダウンロードして解凍します。
#wget http://batleth.sapienti-sat.org/projects/mb2md/mb2md-3.20.pl.gz
#gunzip mb2md-3.20.pl.gz

得られたスクリプトは、以下のように使用します。
#perl ~/mb2md-3.20.pl -s mboxファイル -d 出力するユーザーmaildir

ex:
#perl ~/mb2md-3.20.pl -s /var/mail/user2 -d /var/mail/maildir/user2

変換作業に入ります。
1ユーザーごとにやっていたらラチがあかないので、実際はスクリプトを作成して連続で実行することになるでしょう。
変換スクリプトのメールパスはフルパスで指定する必要があります。
一時ディレクトリへ変換出力する
#perl ~/mb2md-3.20.pl -s /var/mail/user2 -d /var/mail/maildir/user2

アクセス権と所有者をユーザー本人に変更(サブディレクトリまで反映)
#chown -R user2 /var/mail/maildir/user2
#chgrp -R user2 /var/mail/maildir/user2
#chmod 700 /var/mail/maildir/user2
※AD連携の場合は、以下のようにグループ設定します
#chgrp -R "domain users" /var/mail/maildir/user2

オリジナルのmboxファイルをリネームします
#mv /var/mail/user2 /var/mail/user2_mbox

変換したディレクトリを移動します
#mv /var/mail/maildir/user2 /var/mail/
事後作業を行います。



Perfect_maildirを使用して変換する

事前作業は終わっているものとします。

スクリプトを配布元から入手します。
Download hearのリンクから、plファイルをダウンロードします。
#wget http://perfectmaildir.home-dn.net/perfect_maildir/perfect_maildir.pl

得られたスクリプトは、以下のように使用します。
#perl perfect_maildir.pl ユーザーmaildir/ < ユーザーmboxファイル

ex:
#perl ~/perfect_maildir.pl /var/mail/maildir/user2 < /var/mail/user2

変換作業に入ります。
perfect_maildirは、ユーザーMailDirディレクトリを自動で生成してくれません。
そればかりか、MailDirに必要なnew、curディレクトリも作成してくれません。事前に用意しておきます。
実際は、ユーザーの数が多ければスクリプトを作成して実行することになるでしょう。
変換スクリプトのメールパスはフルパスで指定する必要があります。
ユーザーのMailDirディレクトリを準備する
#mkdir /var/mail/maildir/user2
#mkdir /var/mail/maildir/user2/new
#mkdir /var/mail/maildir/user2/cur

変換する
#perl ~/perfect_maildir.pl /var/mail/maildir/user2 < /var/mail/user2

アクセス権と所有者をユーザー本人に変更(サブディレクトリまで反映)
#chown -R user2 /var/mail/maildir/user2
#chgrp -R user2 /var/mail/maildir/user2
#chmod 700 /var/mail/maildir/user2
※AD連携の場合は、以下のようにグループ設定します
#chgrp -R "domain users" /var/mail/maildir/user2

オリジナルのmboxファイルをリネームします
#mv /var/mail/user2 /var/mail/user2_mbox

変換したディレクトリを移動します
#mv /var/mail/maildir/user2 /var/mail/
事後作業を行います。



事後作業
いままでMBoxで使用していた/var/mailを、MailDir形式のアクセス権にします。
新しいユーザーが、ディレクトリを作成できるようにします。
/var/mailはシンボリックリンクのため、/var/spool/mailへ設定します。
#chmod o+w /var/spool/mail

メールサーバの設定を、MBox設定からMailDir設定へ変更します。
Postfixの設定変更
#vi /etc/postfix/main.cf
mail_spool_directory = /var/mail/  末尾へスラッシュを加えてMailDir形式へ設定

Dovecotの設定変更
#vi /etc/dovecot/conf.d/10-mail.conf の編集
mail_location = maildir:/var/mail/%u
サービスを起動し、受信確認をします。
#systemctl start postfix
#systemctl start dovecot


補足
変換したあとのMailDirのアクセス権が不足していると、メール着信やPOP取り出しでPermission deniedが発生したりします。
Aug 28 19:59:38 mailsv dovecot[26579]: pop3(user2)<26900><9YQWC0vnC9jAqAEU>: Error: Couldn't init INBOX: Mailbox INBOX: opendir(/var/mail/user2/new) failed: Permission denied (euid=106601107(user2) egid=106600513(domain users) missing +r perm: /var/mail/user2/new)

・/var/spool/mailに書き込み権はあるか
・ユーザーMailDirのchownやchgrpなどが再帰的に実行されているか、アクセス権はあるか

などを確認します。

参考にメールディレクトリのデフォルトのアクセス権を例示しておきます。
Mboxの場合のデフォルトのアクセス権
#/var/spool/mailのアクセス権
drwxrwxr-x.  5 root mail  84  8月 28 19:46 mail

#/var/mail配下のmboxファイルのデフォルトのアクセス権
-rw-------. 1 user1 mail         2472  8月 28 13:16 user1

#MailDir形式に必要な/var/spool/mailのアクセス権
drwxrwxrwx.  5 root mail  84  8月 28 19:46 mail

#/var/mail配下のmaildirのアクセス権
#サブディレクトリも同じ所有者情報が要ります
drwx------  5 user2 user2 39  8月 28 19:45 user2

#AD連携の場合
drwx------  5 user2 domain users   39  8月 28 19:45 user2







prev.gif