postfix/dovecotのメールサーバーで、従来の方式「FTPユーザーがメール受信ユーザー」という環境からバーチャルメール環境に切り替える方法について書きます。
バーチャルメールの運用ツールは PostfixAdmin 1択です。
他によいツールを知りません。
そして、PostfixAdminを使用するにはデータベース MySql が必要です。
前提条件としてpostfix/dovecotでメールを送受信できる環境まで設定済みとします。
postfix/dovecotのインストールと設定については postfix 2.3.x の設定 や dovecot ver.1系と2系の違い を参照してください。
■ PostfixAdmin インストール
(0) 事前準備
mysql に postfixデータベース、専用のpostfixユーザーを作成しておく必要があります。
(データベースは空でよいです)
データベース名: postfix ユーザー名 : postfix パスワード : xxxxxxxxxxxx
メールボックスにアクセスするバーチャルユーザーを作成します。
後でいくつかの設定ファイルにユーザーID、グループIDを記述するため、ここで決めておきます。
使っていない番号なら何でもよいのですが、ここでは ユーザーID = 600、 グループID = 600 とします。
# mkdir /home/vmailbox # groupadd -g 600 vuser # useradd -g vuser -u 600 -d /home/vmailbox -s /sbin/nologin vuser # chown vuser:vuser /home/vmailbox # chmod 771 /home/vmailbox
(1) PostfixAdmin インストール
# cd /usr/local/src # # wget http://jaist.dl.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.3.5/postfixadmin-2.3.5.tar.gz # # tar xzvf postfixadmin-2.3.5.tar.gz # mv postfixadmin-2.3.5 /var/www/postfixadmin # cd /var/www/postfixadmin # chown -R apache * #
(2) PostfixAdmin 設定
/var/www/postfixadmin/config.inc.php
//$CONF['configured'] = false; $CONF['configured'] = true; $CONF['setup_password'] = 'changeme'; // setup後に画面に表示されたものを設定 //$CONF['default_language'] = 'en'; $CONF['default_language'] = 'ja'; $CONF['database_type'] = 'mysql'; $CONF['database_host'] = 'localhost'; $CONF['database_user'] = 'postfix'; $CONF['database_password'] = 'xxxxxxxxxxxx'; $CONF['database_name'] = 'postfix'; $CONF['encrypt'] = 'md5crypt'; // DBにはMD5ハッシュを格納 $CONF['encrypt'] = 'cleartext'; // APOPが必要なら平文で格納 //$CONF['page_size'] = '10'; $CONF['page_size'] = '100'; //$CONF['domain_path'] = 'NO'; // NO の場合 maildir:/home/vmailbox/%n@%d $CONF['domain_path'] = 'YES'; // YES の場合 maildir:/home/vmailbox/%d/~ //$CONF['domain_in_mailbox'] = 'YES'; // YES の場合 maildir:/home/vmailbox/%d/%n@%d $CONF['domain_in_mailbox'] = 'NO'; // NO の場合 maildir:/home/vmailbox/%d/%n $CONF['aliases'] = '100'; $CONF['mailboxes'] = '100'; $CONF['maxquota'] = '100'; $CONF['quota'] = 'NO'; $CONF['alias_control'] = 'YES'; // エイリアス(転送先などの作成)を自分で制御 $CONF['alias_control_admin'] = 'YES'; $CONF['backup'] = 'NO'; $CONF['sendmail'] = 'NO'; $CONF['fetchmail'] = 'NO'; $CONF['user_footer_link'] = "main.php"; //$CONF['show_footer_text'] = 'YES'; $CONF['show_footer_text'] = 'NO'; //$CONF['emailcheck_resolve_domain']='YES'; $CONF['emailcheck_resolve_domain']='NO'; // 管理者メールドレス $CONF['admin_email'] = 'admin@運用ドメイン名'; $CONF['default_aliases'] = array ( 'admin' => 'admin@運用ドメイン名' );
/var/www/postfixadmin/backup.php
session_cache_limiter('public'); // IE & SSLサイト用の設定を追加します require_once('common.php');
Apache alias設定
/etc/httpd/conf.d/postfixadmin.conf
Alias /postfixadmin "/var/www/postfixadmin" <Directory "/var/www/postfixadmin"> Order allow,deny Allow from all </Directory>
Apache再起動
# apachectl configtest # apachectl restart
ブラウザで初期設定
http://xxxxxxxxxxxx/postfixadmin/setup.php Setup password を設定した後 ドメイン管理者メールアドレス xxxx@xxxx.xxxx ※特権管理者のログイン名 ドメイン管理者パスワード xxxx
画面に setup_password のハッシュが表示されるので config.inc.php に記述します。
■ postfixの postfixadmin対応
/etc/postfix/main.cf
myorigin = $myhostname inet_interfaces = all home_mailbox = Maildir/ # SMTP-Auth smtpd_sasl_auth_enable = yes smtpd_sasl_local_domain = $myhostname smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination # dovecot-sasl smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth # for broken broken_sasl_auth_clients = yes # hashバーチャルドメイン設定を使わない #virtual_alias_maps = hash:/etc/postfix/virtual # バーチャルドメイン設定 virtual_transport = virtual virtual_mailbox_base = /home/vmailbox virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf virtual_alias_domains = $virtual_alias_maps virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf # 事前準備で用意したユーザID,グループID virtual_minimum_uid = 600 virtual_uid_maps = static:600 virtual_gid_maps = static:600 # メールボックスサイズ制限 virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf virtual_mailbox_limit_override = yes virtual_overquota_bounce = yes
以下のパスワード部分は、事前準備で作成したmysqlのpostfixデータベースのパスワードを設定します。
/etc/postfix/mysql_virtual_alias_maps.cf
user = postfix password = xxxxxxxxxxxx hosts = localhost dbname = postfix table = alias select_field = goto where_field = address
/etc/postfix/mysql_virtual_domains_maps.cf
user = postfix password = xxxxxxxxxxxx hosts = localhost dbname = postfix table = domain select_field = domain where_field = domain
/etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix password = xxxxxxxxxxxx hosts = localhost dbname = postfix table = mailbox select_field = maildir where_field = username
/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
user = postfix password = xxxxxxxxxxxx hosts = localhost dbname = postfix table = mailbox select_field = quota where_field = username
■ dovecotの postfixadmin対応
dovecot-mysqlドライバーが必要です
dovecot-mysqlドライバーをインストールします。
# yum -y install dovecot-mysql
/etc/dovecot/dovecot-mysql.conf
driver = mysql #default_pass_scheme = MD5-CRYPT default_pass_scheme = PLAIN connect = dbname=postfix user=postfix host=/var/lib/mysql/mysql.sock password=xxxxxxxxxxxx password_query = SELECT password FROM mailbox WHERE username = '%u' AND active = '1' user_query = SELECT concat('/home/vmailbox/', maildir) as home, 600 as uid, 600 as gid FROM mailbox WHERE username = '%u' AND active = '1'
/etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/home/vmailbox/%d/%n first_valid_uid = 600 first_valid_gid = 600
/etc/dovecot/conf.d/20-pop3.conf
protocol pop3 { pop3_uidl_format = %08Xu%08Xv }
/etc/dovecot/conf.d/10-auth.conf
#disable_plaintext_auth = yes disable_plaintext_auth = no #auth_mechanisms = plain auth_mechanisms = plain login #!include auth-system.conf.ext !include auth-mysql.conf.ext
/etc/dovecot/conf.d/10-master.conf
# Postfix smtp-auth unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix }
★新規作成
/etc/dovecot/conf.d/auth-mysql.conf.ext
passdb { driver = sql args = /etc/dovecot/dovecot-mysql.conf } userdb { driver = sql args = /etc/dovecot/dovecot-mysql.conf }
蛇足ですがpostfixデータベースのパスワードxxxxxxxxxxxxを書いておいたファイルをFTPでアップロードして置換すれば一発です。
sed -i "s/xxxxxxxxxxxx/パスワード/g" /etc/postfix/mysql_virtual_alias_maps.cf sed -i "s/xxxxxxxxxxxx/パスワード/g" /etc/postfix/mysql_virtual_domains_maps.cf sed -i "s/xxxxxxxxxxxx/パスワード/g" /etc/postfix/mysql_virtual_mailbox_maps.cf sed -i "s/xxxxxxxxxxxx/パスワード/g" /etc/postfix/mysql_virtual_mailbox_limit_maps.cf sed -i "s/xxxxxxxxxxxx/パスワード/g" /etc/dovecot/dovecot-mysql.conf
自動起動の設定、再起動など
chkconfig dovecot on chkconfig postfix on /etc/init.d/dovecot restart /etc/init.d/postfix restart tail -30 /var/log/maillog
(おまけ)postfixadmin メールボックス自動削除
postfixadminでメールアドレス削除してもメールボックスのディレクトリは削除されないので、それをcronで削除する仕組みを作ります。
/var/www/postfixadmin/ADDITIONS/mailbox_remover.pl
# メールボックス削除後のアーカイブフォルダ my $archdir="/home/vmailbox_archives"; # z option があるアーカイブ圧縮コマンド my $archcmd="/bin/tar"; # メールボックスのベースフォルダ my $maildir_path="/home/vmailbox"; # サブフォルダを探索する必要がある場合に config.inc.php が必要 # $CONF['domain_path'] = 'YES'; my $pfadmin_config="/var/www/postfixadmin/config.inc.php"; # database information my $host="localhost"; my $port="3306"; my $userid="postfix"; my $passwd="xxxxxxxxxx"; my $db="postfix"; ########## #print "Ctrl-C in 5 seconds to abort before removal starts...\n"; #sleep 5; 120行目 行末セミコロンを追加 ; system(@args) == 0 or die "Creating archive for $maildir failed: $?";
実行可能にして
# chmod 755 /var/www/postfixadmin/ADDITIONS/mailbox_remover.pl
本当に削除じゃなくて移動するので、移動先アーカイブフォルダ作成
# mkdir /home/vmailbox_archives
cron登録
/etc/cron.d/postfixadmin
0 4 * * * root /var/www/postfixadmin/ADDITIONS/mailbox_remover.pl
これで毎朝4時にチェックして、データベースから無くなってるメールアドレスのデータを /home/vmailbox_archives へ移動します。
本当に要らない場合は時々自分で削除するか、または別のcron仕込む等で。