exim4 の retry 設定の変更
背景
exim4 のログをみていると、以下のような retry に関するエラーログが。
T=remote_smtp defer (-53): retry time not reached for any host
retry に至る根本的な理由は置いといて、この挙動が不審な場合には exim_tidydb で retry のヒントデータベースをクリーンするとよいよ、という話が以下。
/usr/sbin/exim_tidydb -t 1d /var/spool/exim retry > /dev/null /usr/sbin/exim_tidydb -t 1d /var/spool/exim reject > /dev/null /usr/sbin/exim_tidydb -t 1d /var/spool/exim wait-remote_smtp > /dev/null
Debian (etch) だと、/etc/cron.daily/exim4-base 辺りでこの処理は daily でなされてます、と。
設定変更方法
このようなケースの場合、勿論クリーンすれば良いのですが、
- ある特定のエラー
- 特定のドメイン
毎などで retry の再送の挙動を変えることで対応することもできます。ネタ元は以下。必要だったところを超訳。
設定ファイル内の retry のセクションでの指定の仕方は以下のどちらかのパターン。多分前者で大抵事足りるはず。
<宛先のパターン> <エラー名> <retry パラメータ> <宛先のパターン> <エラー名> <sender アドレスリスト> <retry パラメータ>
宛先のパターン
以下のように、ドメイン指定でも、アドレス指定でも OK。
lookingglass.fict.example alice@lookingglass.fict.example
正規表現も利用出来るが、その場合にはアドレスへの完全一致にすること。また、MX レコードのホストを指定する事も出来るが、複数の MX がドメインに指定されている場合には挙動には注意すること。
エラー名
各エラーを以下のような形で指定。
- auth_failed
- 認証エラー
- data_4xx
- DATA コマンドでのエラー
- mail_4xx
- MAIL コマンドでのエラー
- rcpt_4xx
- RCPT コマンドでのエラー
4xx 系は、xx の部分はそのまま「x」でワイルドカードにしてもよいし、具体的なエラーコードにしてもよい。SMTP コマンドやエラーコードは各種マニュアルを参考のこと。
- lost_connection
- 予期せぬタイミングでの接続断
- refused_MX
- MX レコードで取得したホストへの接続拒否
- refused_A
- MX レコード以外から取得したホストへの接続拒否
- refused
- 接続拒否
- timeout_connect_MX
- MX レコードで取得したホストへの接続のタイムアウト
- timeout_connect_A
- MX レコード以外から取得したホストへの接続のタイムアウト
- timeout_connect
- 接続のタイムアウト
- timeout_MX
- MX レコードで取得したホストへの接続時もしくは SMTP セッション内でのタイムアウト
- timeout_A
- MX レコード以外から取得したホストへの接続時もしくは SMTP セッション内でのタイムアウト
- timeout
- 接続時もしくは SMTP セッション内でのタイムアウト
- tls_required
- TLS が必要なのに利用していない
- quota
- mailbox の quota の上限越え
- quota_
retry パラメータ
retry のパラメータは以下のパターンをセミコロン区切りで記述。区切ったものを順繰りに適用する形。
<F|G|H>,<上限時間>,<最初で指定したアルゴリズムに従うパラメータ>
最初の文字は
- F
- 固定のインターバルで retry する。引数にはインターバルを指定
- G
- 等比級数的にインターバルを伸ばしながら retry する。引数にはインターバルの初期値と重みを指定する
- H
- ランダムにインターバルを決定しながら retry する。引数は G と同じで、最小値が G の初期値、最大値が初期値に重みをかけたもの。
設定方法
Debian の場合で、split configuration していない場合 /etc/exim4/exim4.conf.template の begin retry の部分を探し、
isenshi.com * F,6h,30m * * F,2h,15m; G,16h,1h,1.5; F,4d,6h
てな感じで設定する。上記の例だと、全てのエラーによる retry で、isenshi.com ドメイン宛のものだけ上限 6 時間で 30 分毎に再送。下のはデフォルト値。最初の 2 時間は 15 分間隔、次に 16 時間までは 1 時間、1.5 時間、2.25 時間、、、と、最後 4 日までは 6 時間毎で再送をし、これを越えると bounce する、と。
その後
# update-exim4.conf # /etc/init.d/exim4 restart