がらくたネット

アフィリエイト広告を利用しています


Postfix + Dovecot 2 + PostfixAdmin + MySQL

Postfix + Dovecot 2 + PostfixAdmin + MySQL

postfix でバーチャルドメイン環境を作りたいと思います。

ポイント

  • postfixを利用
  • Dovecot v2.xを利用
  • PostfixAdminを利用
  • Quota設定したい

関連ソフトのインストール

yum install postfix dovecot mysql-server dovecot-mysql php

php.iniのdate.timezone設定忘れずにね。

Postfix周り

ポイント

  • postfixはpostfixAdmin経由でmysqlでユーザやドメインを管理
  • バーチャルユーザのメールディレクトリは/home/vusers/[ドメイン名]/[ユーザ名]
  • Maildir形式
  • Dovecotの力を借りてSMTP-AUTHを利用
  • Quota利用
  • バーチャルユーザ受けるユーザはvusersでUID/GID共に10000
  • サーバ上のアカウントに対するメール送信を可能にする、というかサーバ個別のpostmasterやroot宛メール等もちゃんと受信する
  • DB名はpostfix、ユーザ名もpostfixとする

postfixはVDAパッチが適用されたものを利用する必要がある。Quota機能が働かないからね。

groupadd -g 10000 vusers
useradd -g 10000 -u 10000 vusers

mysql関連の設定ファイル作成

vi /etc/postfix/mysql_virtual_alias_maps.cf
user = postfix
password = ********
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address


vi /etc/postfix/mysql_virtual_domains_maps.cf
user = postfix
password = ********
hosts = localhost
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and active = '1'


vi /etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix
password = ********
hosts = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = username


vi /etc/postfix/mysql_virtual_mailbox_limit_maps.cf
user = postfix
password = ********
hosts = localhost
dbname = postfix
query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'

myhostnameはサーバFQDN名として、このFQDN名でのメール配送はローカル配送として /etc/aliasesは有効のまま利用する

main.cf


myhostname = xxxx.xxxx.xxxx
mydestinaion = $myhostname, localhost
inet_interface = all
inet_protocols = ipv4
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP Unknown

#Virtual Domain w/MySQL
local_transport = local
virtual_transport = virtual
virtual_mailbox_base = /home/vusers
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
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000
virtual_minimum_uid = 10000

#SMTP-Auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_local_domain = $myhostname
smtpd_client_restrictions = reject_rbl_client bl.spamcop.net
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes


#Quota w/VDA Patch
virtual_create_maildirsize = yes
virtual_maildir_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_overquota_bounce = no
virtual_trash_count = no

#SMTPS
smtpd_use_tls = no
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.pem
smtpd_tls_key_file = /etc/pki/tls/certs/mail.pem
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache

master.cf

詳細設定は後ほど
submissionの箇所コメントを外す
smtpsの箇所コメントを外す

postfixAdmin周り

postfixAdminを公式サイトからダウンロード

tar zxvf postfixadmin-2.3.6.tar.gz
mv postfixadmin-2.3.6 /var/www/html
cd /var/www/html
ln -s postfixadmin-2.3.6 postfixAdmin

データベース周りの設定

mysql -p
CREATE DATABASE postfix;
CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'パスワード';
GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';

config.inc.phpが設定ファイルであるが、postfixAdminでは将来のアップデート等の為にこのファイルを編集せずにconfig.local.phpを作成すれば上書きできる機構が含まれているので、この機構を利用する。

必要な設定は全てconfig.local.phpに仕込む

vi /var/www/html/postfixAdmin/config.local.php

<?php
$CONF['configured'] = true;
$CONF['setup_password'] = '指定された文字列';
$CONF['default_language'] = 'ja';
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'データベースパスワード';
$CONF['database_name'] = 'postfix';
$CONF['admin_email'] = 'サイト管理者メールアドレス';
$CONF['alias_domain'] = 'NO';
$CONF['dovecotpw'] = "/usr/bin/doveadm pw";
$CONF['show_password'] = 'YES';
$CONF['show_footer_text'] = 'NO';

$CONF['emailcheck_resolve_domain']='NO';
$CONF['create_mailbox_subdirs_prefix']='';

$CONF['new_quota_table'] = 'YES';
$CONF['quota'] = 'YES';

$CONF['aliases'] = '0';
$CONF['mailboxes'] = '0';
$CONF['maxquota'] = '0';

$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';

$CONF['encrypt'] = 'md5crypt';

$CONF['user_footer_link'] = "http://サイトアドレス/postfixAdmin/users/main.php";

$CONF['mailbox_postdeletion_script'] = 'sudo -u vusers /home/vusers/bin/postfixadmin-mailbox-postdeletion.sh';
$CONF['domain_postdeletion_script'] = 'sudo -u vusers /home/vusers/bin/postfixadmin-domain-postdeletion.sh';
?>

で、ブラウザからpostfixAdmin/setup.phpに接続する
環境チェックが実行され問題なければデータベース設定が走る

画面下部に管理者アカウントの作成画面があるので必要事項を入力
Setup Passwordはセットアップ用パスワード文字列を入力
ドメイン管理者は管理者メールアドレスで有効なものでなければいけない

そして、Setup passwordが違うと怒られるはず。赤字でメッセージが表示される。 $CONF['setup_password'] = からの一行をconfig.local.phpに追記して再度実施する。

実行できると「管理者を追加しました」と表示されるのでOK。 setup.phpを削除orリネームして再度接続する。

余談…
http://sourceforge.net/apps/mediawiki/postfixadmin/index.php?title=CryptによるとPostfixAdminの$CONF[encrypt]とDovecotのPassword Schemeで適合するものしないものがあるのが分かる。
Password SHEMEはMD5-CRYPTで$CONF[encrypt]はmd5cryptがよいのか??

dovecotpwの設定項目があって、さらにencryptも’dovecot:MD5CRYPT’とか設定できるがまだバグがあるらしく、dovecot2.x系では正常に動作しない。なので、dovecot専用設定は行わない。これでも問題なく使えるらしい。。。

$CONF['user_footer_link']だが、変数名とは異なりユーザがログインした時の「メイン」のリンク先となるので正しく設定しておいてあげないといけない。ちゃんとconfig.inc.phpに注釈で記載がある。

Announcement

管理者またはユーザでログインするとAnnouncementが表示される件

motd.txtとmotd-users.txtはリネームしておくこと。このファイルが存在しているとユーザがログインしたときはmotd-users.txtが、管理者でログインした時はmotd.txtが表示される。config.inc.phpで指定する事はできない。特権管理者の場合はmotd-admin.txtとなる。
templates/menu.php内で明示的に指定されているwww

mv motd.txt motd.txt.org
mv motd-users.txt motd-users.txt

削除処理

postfixAdminからユーザやドメインを削除しても実際にはデータベース内から削除されるだけで、ファイルシステム側のディレクトリ等は削除されない。これはpostfixadminがphpプログラムでWebサーバ上に存在しているのが原因。権限の問題で削除したくてもできない。

そこで、解決方法。

config.inc.phpによると

$CONF['mailbox_postcreation_script'] メールボックス作成後実行
$CONF['mailbox_postedit_script'] メールボックス変更後実行
$CONF['mailbox_postdeletion_script'] メールボックス削除後実行
$CONF['domain_postcreation_script'] ドメイン作成後実行
$CONF['domain_postdeletion_script'] ドメイン削除後実行

のそれぞれを設定してシェルスクリプト側で対応できるようになってるとの事

この右辺に記述するサンプルスクリプトはpostfixadmin展開ディレクトリのADDITIONS以下にある

この右辺

$CONF['mailbox_postdeletion_script'] = 'sudo -u vusers /home/vusers/bin/postfixadmin-mailbox-postdeletion.sh';
$CONF['domain_postdeletion_script'] = 'sudo -u vusers /home/vusers/bin/postfixadmin-domain-postdeletion.sh';
とか書くのだが、sudo使うわ、Webサーバから実行するわでそこら辺の調整が必要。

mkdir /home/vusers/bin
mkdir /home/vusers/deleted-maildirs
cp ADDITIONS/*.sh /home/vusers/bin
chown -R vusers: /home/vusers/bin
chown -R vusers: /home/vusers/deleted-maildirs
chmod 700 /home/vusers/bin/*.sh

visudo
#Defaults requiretty ←コメントアウトする
apache ALL=(vusers) NOPASSWD: /home/vusers/bin/*.sh ←最終行に追記

vi postfixadmin-mailbox-postdeletion.sh

basedir=/home/vusers ←修正
trashbase=/home/vusers/deleted-maildirs ←修正

66行目から
if [ ! -e "$maildir" ]; then
  echo "maildir '$maildir' does not exist; nothing to do."
  exit 0 ←ここを1から0に変更する
fi

最後から3行目の所
mv $maildir $trashdir
となってる。つまり$trashdirに移動させるだけなんですね。 完全削除するのであれば、ここをrmとかに変更すればOKかと

vi postfixadmin-domain-postdeletion.sh

basedir=/home/vusers ←修正
trashbase=/home/vusers/deleted-maildirs ←修正

最後から3行目の所
mv $domaindir $trashdir
となってる。つまり$trashdirに移動させるだけなんですね。 完全削除するのであれば、ここをrmとかに変更すればOKかと

作成部分はpostfixかdovecotがやってくれるので設定しなくてよさげ。 エラーになるのは、postfixadminでユーザやドメインを作成しておいて「ようこそメール」を送信しない状態でユーザやドメインを削除した場合かな。

ドメインを削除する場合で、ドメインディレクトリがファイルシステム上に存在しない場合はこのシェルスクリプトではexit 0となるので、エラーなく完了できる。 なので、ドメイン作成時のスクリプトを定義しておく必要はない。

dovecot周り

Dovecot-2.0.9でテスト

dovecotのMySQL用ドライバ、なければインストールしておく
yum install -y dovecot-mysql
rpm -ql dovecot-mysql
/usr/lib64/dovecot/auth/libdriver_mysql.so
/usr/lib64/dovecot/dict/libdriver_mysql.so
/usr/lib64/dovecot/libdriver_mysql.so

/etc/dovecot/dovecot.confを小修整して設定ファイル自体はlocal.confに集約する。
これによって、将来のアップデートに対応しやすくなる。

基本設定

vi /etc/dovecot/dovecot.conf

!include_try /etc/dovecot/local.conf ←最終行、コメントを外す

本体の設定

vi /etc/dovecot/local.conf

# debug関係
auth_debug_passwords = yes
auth_verbose = no
auth_debug = yes

listen = *
disable_plaintext_auth = no
auth_mechanisms = PLAIN LOGIN CRAM-MD5
mail_location = maildir:/home/vusers/%d/%n
first_valid_uid = 10000
first_valid_gid = 10000
mail_plugins = quota

protocol imap {
  imap_client_workarounds = delay-newmail tb-extra-mailbox-sep
  mail_plugins = $mail_plugins imap_quota
}
protocol pop3 {
  pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}
passdb {
  driver = sql
  args = /etc/dovecot/dovecot-postfixadmin-mysql.conf
}
userdb {
  driver = sql
  args = /etc/dovecot/dovecot-postfixadmin-mysql.conf
}
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
  }
}
plugin {
  quota = maildir:User quota
}

vi /etc/dovecot/conf.d/10-auth.conf

auth_mechanisms = plainをコメントアウト
!include auth-system.conf.extをコメントアウト

dovecotのmysql用設定ファイルを作成

vi /etc/dovecot/dovecot-postfixadmin-mysql.conf 

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=****
default_pass_scheme = MD5-CRYPT
password_query = SELECT password FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT concat('/home/vusers/', maildir) AS home, 10000 AS uid,
 10000 AS gid FROM mailbox WHERE username = '%u' AND active = '1'

doveconf -nで規定値からの変更点のみが表示される。これで設定内容を確認する

アフィリエイト広告を利用しています

バウンスメールテンプレート

postfixからの送信されるバウンス系メールはテンプレート形式で変更できる
bounce_template_file = /etc/postfix/bounce.cf とか

テンプレートファイルが/usr/share/doc/postfix-2.6.6/bounce.cf.defaultにあるのでまずは、こいつをコピーする。そこから編集が始まる。この辺が参考になるかも

maildirsize とか quota とか

今回のQuotaはmaildirsize fileを利用している

ユーザのホームディレクトリ配下にmaildirsizeというファイルが作成される

cat maildirsize
2048000S
524 1
-524 -1
 
ってな具合
最初の行はQuota値でバイト表記
以降が「バイト数 メール数」となる
このファイル自体は5120バイトまでしか拡張できないので
特定のタイミングで「バイト数 メール数」部分が合算される

このファイルはpostfixが対象ユーザにメール配送するタイミングで作成/更新がなされる。 そして、メールクライアントで読み取った後に更新される。 Dovecotの場合、POPであれば即時更新、IMAPでもほぼ同様の動き。 特殊なのが、ごみ箱を空にした時の動きかなぁ。IMAPクライアントを終了させたときにのみ更新されている様子です。

IMAPでのごみ箱「Trash」は扱いが難しいので要注意です。 受信フォルダからゴミ箱に移動する際には、一度メッセージをコピーしてオリジナルを削除する。 つまりこの時点でOver Quotaであればコピーができないのでゴミ箱に移動できない。 つまりメッセージを削除する方法がないって事になる。 Dovecot側ではゴミ箱をQuotaの制限外に設定するか一定量のユーザQuotaとは別のQuotaを仕掛けるかの方法しかないって言ってます。 この時に利用するのが、quota_ruleって事になるんだね…

Dovecot 2.xではPlugin設定のQuotaでmaildirを指定することにより、Maildir++形式であるmaildirsizeファイルでのQuotaがサポートされる。この辺り

postfixadminの管理者パスワードを再設定

postfixAdminの管理者ログインパスワードを忘れた場合、データベース内の情報を書き換えるしかなさげ。 パスワードはCRYPT-MD5で暗号化されてるので、まずphpで暗号化されたパスワード文字列を生成してからsqlで該当部分を更新すればよい。

phpでパスワード文字列生成

phpファイルを作成してもよいけど、まー単純にinteractivelyモードでもよさげ。
********が設定したいパスワード文字列
php -a
php > print(crypt('********'));
$1$XXXXXXXX$XXXXXXXXXXXXXXXX
php > quit

暗号化されたパスワード文字列をデータベースに突っ込む

テーブル内容を確認してアップデート
mysql -u postfix -p postfix
Enter password: ********
mysql> select username,password from admin;
+------------------------+------------------------------------+
| username               | password                           |
+------------------------+------------------------------------+
| admin@e-garakuta.net | $1$YYYYYYYY$YYYYYYYYYYYYYYYYYYYYYY |
+------------------------+------------------------------------+
1 row in set (0.00 sec)

mysql> update admin set password='$1$XXXXXXXX$XXXXXXXXXXXXXXXX' where username='admin@e-garakuta.net';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

動き的なところ

ちょっと悩んだ動き的なところ

  • postfixAdminでドメインを作成してもディレクトリは作成されない
  • postfixAdminでユーザを作成しても「ようこそメールの送信」を行わないとユーザディレクトリが作成されない
  • postfixAdminでユーザを作成して「ようこそメールの送信」を行うとユーザディレクトリが作成される。この際ドメインディレクトリがなければ作成される。
  • 「ようこそメール」の送信元はユーザを作成した管理者メールアドレスとなる
  • popログインするとユーザディレクトリがなければ作成される。ドメインディレクトリがなければ作成される。
  • IMAPログインするとユーザディレクトリがなければ作成される。ドメインディレクトリがなければ作成される。

POP3S IMAPS SMTPS

SSL証明書を利用してPOP3S/SMTPS/IMAPS設定を行う

証明書は

/etc/postfix/mail.pem 証明書
/etc/postfix/mail.key 秘密鍵

とする。秘密鍵にはパスフレーズがついていないものとする。

中間証明書とかがあれば、証明書に結合させておく。結合って言っても、中間証明書の内容を証明書に追記しておくだけね。あ、証明書も中間証明書も秘密鍵も全部テキストファイルだから。

/etc/postfix/main.cf

smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/postfix/mail.pem
smtpd_tls_key_file = /etc/postfix/mail.key
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache

/etc/postfix/master.cf

以下の行のコメントアウトを外す
smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

/etc/dovecot/conf.d/10-ssl.conf

以下をコメントアウト
#ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
#ssl_key = </etc/pki/dovecot/private/dovecot.pem

/etc/dovecot/00-base.conf

以下を追記
ssl_cert = </etc/postfix/mail.pem
ssl_key = </etc/postfix/mail.key

で、最後にpostfixとdovecotを再開させればOK

ちなみに

プロトコル ポート番号
SMTPS 465
IMAPS 993
POP3S 995

ですね。

ドメインクォーター

ドメインクォーター(Domain Quota)について

PostfixAdminやDovecotにはDomain Quotaという文字がところどころ出てくる。 でも実際に設定している事例とかがあまり見つからない。

PostfixAdmin

PostfixAdminはSVNで最新を取得すれば利用できるっぽい。 試したのはr1166 2011-08-05版ね。

config.local.phpのQuota関連部分

$CONF['maxquota'] = '0';  //デフォルト10 MB
$CONF[domain_quota_default] = '0';  //デフォルト2048 MB
$CONF['quota'] = 'YES';  //デフォルトNO
$CONF['domain_quota'] = 'YES'  //デフォルトYES
$CONF['used_quotas'] = 'YES';  //デフォルトNO
$CONF['new_quota_table'] = 'YES';  //デフォルトNO

これで、PostfixAdminにはドメイン一覧に「容量制限(MB)」と「Domain quota(MB)」が表示される。 ユーザ一覧には「容量制限(MB)」が表示される。 Domain quotaはドメイン全体のQuotaサイズを指定する。 ドメインの容量制限はそのドメイン内のメールボックスに設定できる最大サイズを指定する。設定しない場合は0を設定する。

ユーザの容量制限値は

  1. ドメインの容量制限値が設定されていればその値
  2. ドメインのQuotaサイズが設定されていればその値または、その値から他ユーザの容量制限値を引いた余り

のどちらかを最大値として設定ができる。無制限にする場合は0を設定する。

あ~ややこしや…

発見~。
ドメインをPAから削除した時にquota2テーブルのドメイン行が消えないって問題。それに削除対象ドメイン内にメールアドレスが存在していてそのレコードがquota2テーブルに残っている場合、メールアドレスを削除しないとそのテーブル行が消えない。
PA2.3.1でメールボックスを削除するとquotaとquota2テーブルから該当行が消えるようになったけど、そこまでの実装。

ドメイン行を削除するにはPAのファイルを修正する必要がある

vi delete.php
 
elseif ($fTable == "domain")
{
    authentication_require_role('global-admin');
    $fWhere = 'domain';
    $result_domain_admins = db_delete ('domain_admins',$fWhere,$fDelete);
    $result_alias = db_delete ('alias',$fWhere,$fDelete);
    $result_mailbox = db_delete ('mailbox',$fWhere,$fDelete);
    $result_alias_domain = db_delete('alias_domain','alias_domain',$fDelete);
    $result_log = db_delete ('log',$fWhere,$fDelete);
    if ($CONF['vacation'] == "YES")
    {
        $result_vacation = db_delete ('vacation',$fWhere,$fDelete);
    }
    if ($CONF['new_quota_table'] == "YES")  ←ここから4行追加です!
    {
        $result_quota2 = db_delete ('quota2','username',$fDelete);
    }
    $result_domain = db_delete ('domain',$fWhere,$fDelete);

これで、ドメインを削除した場合にquota2テーブルからドメイン行は消えるようになる。

Dovecot

まず、Dictionaryの設定

/etc/dovecot/dict-quota.conf

connect = host=localhost dbname=postfix user=postfix password=********
map {
  pattern = priv/quota/storage
  table = quota2
  username_field = username
  value_field = bytes
}
map {
  pattern = priv/quota/messages
  table = quota2
  username_field = username
  value_field = messages
}

/etc/dovecot/conf.d/00-base.conf

plugin {
  quota2 = dict:User quota::proxy::quota
  quota = dict:Domain quota:%d:proxy::quota
}
dict {
  quota = mysql:/etc/dovecot/dict-quota.conf
}

これで、Dovecotを通過したメールデータの情報がquota2テーブルに反映されるようになり quota制限するための現在値を取得できるようになる。

/etc/dovecot/postfixadmin-mysql.conf

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=********
default_pass_scheme = MD5-CRYPT
password_query = SELECT password FROM mailbox \
  WHERE username = '%u' AND active = '1'
user_query = SELECT concat('/home/vusers/domains/', maildir) AS home, \
  10000 AS uid, 10000 AS gid, \
  CONCAT('*:bytes=', mailbox.quota) AS quota2_rule, \
  CONCAT('*:bytes=', domain.quota*1024000) AS quota_rule \
  FROM mailbox,domain WHERE username = '%u' AND mailbox.active = '1' \
  AND domain.domain = '%d'
iterate_query = SELECT username FROM mailbox

これで、Dovecotとしてのユーザ認証データ内にユーザのメールボックスクォーターとドメインクォーターを設定することになる。

iterate_query行はデフォルトで組み込まれているユーザ情報検索クエリを上書きするSQL文。 これを記述する事でdoveadm quota -Aが利用できるようになる。

iterate_queryなしの場合
doveadm(root): Error: User listing returned failure
doveadm: Error: Failed to iterate through some users
となり、表示されない。

容量超過時のメッセージ設定を施す

plugin {
  quota_exceeded_message = Quota exceeded .(容量オーバーです)
}

Quota Warning設定を施す

plugin {
  quota_warning = storage=95%% quota-warning 95 %u %d
  quota_warning2 = storage=80%% quota-warning 80 %u %d
  quota2_warning = storage=95%% quota2-warning 95 %u
  quota2_warning2 = storage=80%% quota2-warning 80 %u
}
service quota-warning {
  executable = script /home/vusers/bin/quota-warning.sh
  unix_listener quota-warning {
    user = vusers
  }
}
service quota2-warning {
  executable = script /home/vusers/bin/quota2-warning.sh
  unix_listener quota2-warning {
    user = vusers
  }
}

通知用スクリプトの設定

quota-warning.sh
#!/bin/sh
PERCENT=$1
USER=$2
DOMAIN=$3
cat << EOF | /usr/local/libexec/dovecot/dovecot-lda -d $USER -o "plugin/quota=dict:Domain quota:noenforcing"
From: postmaster
Subject: Domain Quota warning
 
Your Domain mailbox is now $PERCENT% full.
EOF
cat << EOF | /usr/local/libexec/dovecot/dovecot-lda -d admin@$DOMAIN -o "plugin/quota=dict:Domain quota:noenforcing"
From: postmaster
Subject: Domain Quota warning
 
Your Domain mailbox is now $PERCENT% full.
EOF
 
quota2-warning.sh
#!/bin/sh
PERCENT=$1
USER=$2
cat << EOF | /usr/local/libexec/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing"
From: postmaster
Subject: User Quota warning
 
Your mailbox is now $PERCENT% full.
EOF
quota_とquota2_は、quota設定時にquota rootを複数設定した場合のそれぞれに対応することが可能なので同じように定義するのです。
quota=がDomainQuotaを見ていて、quota2=がUserQuotaを見てる状態です。
-oオプションは該当メールがQuota制限にかからないようにするためのオプションだが、ヘルプには該当箇所が見当たらないので実は利用できないんぢゃないかと思っている。どうなんだろうか?

Clam Spam Amavis

ここまできたら、ClamAVとSpamAssassinでウィルスチェックとスパムチェックまでやってしまおうおう。

インストールは単純

yum install -y clamd amavisd-new spamassassin

clamd周り

cd /etc
cp clamd.conf clamd.conf.org
sed -i "s/^TCPSocket 3310/#TCPSocket 3310/g" clamd.conf
sed -i "s/^User clam/#User clam/g" clamd.conf
chkconfig clamd on
freshclam

amavisd周り

cd /etc/amavisd
cp amavisd.conf amavisd.conf
touch blacklist whitelist
vi amavisd.conf
  $mydomain = '自ドメイン名';
  $log_level = 1;
  @local_domains_maps = (1);
  $sa_tag_level_deflt  = 0;
  $sa_tag2_level_deflt = 5.0;
  $sa_kill_level_deflt = -999;
  $sa_spam_subject_tag = '[SPAM] ';  ←修正
  $final_virus_destiny      = D_PASS; ←修正
  $final_spam_destiny       = D_PASS; ←修正
  #  qr'^\.(exe-ms|dll)$',         ←コメントアウト
  #  [ qr'^\.(rpm|cpio|tar)$'       => 0 ], ←コメントアウト
  #  qr'.\.(pif|scr)$'i,       ←コメントアウト
  #  qr'.\.(exe|vbs|pif|scr|cpl)$'i, ←コメントアウト
  ['ClamAV-clamd',
  \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"], ←修正
  以下は追記
  @whitelist_sender_maps = (
    read_hash('/etc/amavisd/whitelist')
  );
  @blacklist_sender_maps = (
    read_hash('/etc/amavisd/blacklist')
  );
chkconfig amavisd on

SpamAssassin周り

cd /etc/mail/spamassassin
mv local.cf local.cf.org
cp v310.pre v310.pre.org
sed -i "s/^#loadplugin Mail::SpamAssassin::Plugin::TextCat/loadplugin Mail::SpamAssassin::Plugin::TextCat/g" v310.pre
vi spamassassin-update
chmod +x spamassassin-update
sh spamassassin-update
mv spamassassin-update /etc/cron.daily/
spamassassin-updateはここに保管spamassassin-update.txt

Postfix周り

cd /etc/postfix
echo 'content_filter=smtp-amavis:[127.0.0.1]:10024' >> main.cf
vi master.cfで以下追加
 smtp-amavis unix -    -    n    -    2  smtp
     -o smtp_data_done_timeout=1200
     -o smtp_send_xforward_command=yes
     -o disable_dns_lookups=yes
	
 127.0.0.1:10025 inet n    -    n    -    -  smtpd
     -o content_filter=
     -o local_recipient_maps=
     -o relay_recipient_maps=
     -o smtpd_restriction_classes=
     -o smtpd_client_restrictions=
     -o smtpd_helo_restrictions=
     -o smtpd_sender_restrictions=
     -o smtpd_recipient_restrictions=permit_mynetworks,reject
     -o mynetworks=127.0.0.0/8
     -o strict_rfc821_envelopes=yes
     -o smtpd_error_sleep_time=0
     -o smtpd_soft_error_limit=1001
     -o smtpd_hard_error_limit=1000

で仕上げ。

service clamd start
service amavisd start
service postfix restart
service dovecot restart

テスト

ちゃんとテストしておくように。

SpamAssassinのテストはGTUBEと呼ばれるコードを本文に記述して通過させるとスコア1000となり動作確認できる。

GTUBEコード
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

ClamAVはEicarテストウィルスファイルを添付させてメールを通過させると動作確認できる。
ただ通常テストを行おうとする端末上のウィルス対策ソフトのリアルタイムスキャンに検知されるので ちゃんと停止してテストすること。

テキストで以下の文字列を入力して拡張子を.comや.exeにすればOK
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*