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