mail」カテゴリーアーカイブ




Postfixのstatus=deferredを対応した件




投稿日:

以下のようなエラーに遭遇して対応したメモです。

[html]Sep 11 05:24:09 host1 postfix/smtp[23693]: xxxxxxxxxxxx: to=<a@domain.com>, relay=xxxx.domain.com[xxx.xxx.xxx.xxx]:25, delay=xxxxx, delays=xxxxx, dsn=xxxxxx, status=deferred (conversation with xxxxx.xxx.ne.jp[xxx.xxx.xxx.xxx] timed out while sending end of data — message may be sent more than once)
[/html]


こんなエラー。
まずは、status=deferredなのでメールは送られていない。
そして、「timed out while sending end of data — message may be sent more than once」 そのまま訳すと「データの最後まで送っている間にタイムアウトした。メッセージは1回以上送信されたかもしれない。」となる。



対応としてできるのは以下でしょうか。
1, deferredでキューに溜まったメールの破棄。
2, 対策設定の追加
3, timed out while sending end of data — message may be sent more than once の根本原因を探す。


1, deferredでキューに溜まったメールの破棄。(前提として、そのメールを削除してよい場合となる。)

ちなみに、送信したメールのステータスは以下の3つになる。

[html]status=sent 送信完了
status=bounce 送信失敗
status=deferred 送信リトライ[/html]

deferredステータスのメールは、メールキューに格納されている。
今回はpostfix だったので以下のように確認・削除をする。

基本的な確認は以下で可能。

[html]
格納場所 /var/spool/postfix/
設定ファイル /etc/postfix/main.cf /etc/postfix/master.cf
[/html]

確認方法

[html]# postcat -q [キューID][/html]


主なメールキューの種類は以下。

maildrop ローカル配信に使用される
incoming 送受信処理中のメールが保持される
active  配信待ちメールが保持される
deferred 送信に失敗したメールがしばらく保持される

ちなみにこれらはメモリには保管されず、サーバ内に保管されるためキュー待ち状態で再起動をした場合には、データが消える事になるのだろう。。。



メールキューの操作コマンド


以下のコマンドで確認から削除までを実施してみる。


[html]
キューを削除
# postsuper -d [キューID]

キューをすべて削除
# postsuper -d ALL deferred

残っているキューの確認
# postqueue -p
[/html]

これで、キューを消して上げることで、スムーズに送信が始まればOK。


2, 対策設定の追加

キューに溜まったメールの再送設定を見直してみます。
基本的に以下の項目を変更してみます。

値については、自分はこんな感じにしてみました。
[html]
minimal_backoff_time = 120s
maximal_backoff_time = 600s
maximal_queue_lifetime = 24h
bounce_queue_lifetime = 24h
queue_run_delay = 100s
[/html]

こちらの意味はこのサイトの説明が良くわかります。ありがとうございます。

http://d.hatena.ne.jp/kidpatrick/20090912

再送に関係する設定は以下
minimal_backoff_time (デフォルト1000秒)
maximal_backoff_time (デフォルト4000秒)
maximal_queue_lifetime (デフォルト5日)
bounce_queue_lifetime (デフォルト5日)
queue_run_delay (デフォルト1000秒) 失敗から再送までのpostfixの動きは、送信失敗 deferredに入れる
queue_run_delay(1000秒)毎にdeferredをチェック
minimal_backoff_time(1000秒)を超えるメールがあれば送信
また失敗したらminimal_backoff_timeの倍(2000秒)の時間後に再送
またまた失敗したらminimal_backoff_timeの倍の倍(4000秒)の時間後に再送
maximal_backoff_time(4000秒)を超えるまでこれを繰り返し
maximal_backoff_timeを超えてしまったら、maximal_backoff_time間隔で再送
maximal_queue_lifetime(5日)を超えてしまったら再送をあきらめる
bounce_queue_lifetime(5日)を超えたら送信もとにエラーメール送信

3, timed out while sending end of data — message may be sent more than once の根本原因を探す。

何度送っても同じ現象が出るのであれば、原因特定はし易いでしょうが、そうでない限り特定は難しいところだとは思います。

以下を参考にしました。

[Postfix] 再送設定 – abs(life)

Postfix ボトルネック分析

Postfixで特定のドメイン宛へのメール配信が遅延し、キューに大量にたまる:やみれんらぼ:So-netブログ

Postfixの設定 | OpenGroove