Postfix 3.1 の新機能 / JSON形式キュー表示と配送流量制御

Postfix 3.1 がリリースされました

個人的に気になった新機能は

  • JSON-format Postfix queue listing.
  • Destination-independent delivery rate delay

の2つです。

JSON形式キュー表示

今までは mailq や postqueue -p コマンドで次のような表示がされていました。

~% postqueue -p
-Queue ID-  --Size-- ----Arrival Time---- -Sender/Recipient-------
8A9AE6EF        275 Sun Mar  6 23:47:06  sender@example.com
                                                          (deferred transport)
                                         rcpt1@example.net
                                         rcpt2@example.net

94AC010A!       298 Sun Mar  6 23:46:33  sender@example.com
                                                          (deferred transport)
                                         rcpt@example.net

-- 0 Kbytes in 2 Requests.

人が読むには良いのですが、プログラムで処理するにはちょっと難しい形式でした。

これが JSON 形式で出力できるようになりました。postqueue -j コマンドを使用します。

~% postqueue -j
{"queue_name": "deferred", "queue_id": "8A9AE6EF", "arrival_time": 1457275626, "message_size": 275, "sender": "sender@example.com", "recipients": [{"address": "rcpt1@example.net", "delay_reason": "deferred transport"}, {"address": "rcpt2@example.net", "delay_reason": "deferred transport"}]}
{"queue_name": "hold", "queue_id": "94AC010A", "arrival_time": 1457275593, "message_size": 298, "sender": "sender@example.com", "recipients": [{"address": "rcpt@example.net", "delay_reason": "deferred transport"}]}

キュー毎に JSON 形式でリストされます。時刻はUNIX時刻(1970-01-01 00:00:00 UTC からの経過秒数)で表され、受信者は配列形式で表されます。プログラムで処理するのも簡単そうです。

配送流量制御

今まで Postfix は配送時の流量を制御することはできませんでした。相手が受け付けるだけメールを送信していました。

3.1 では明にメッセージ配送を遅延させることができるようになりました。

たとえば default_transport_rate_delay = 3s を設定すれば、キューに入ってから配送を開始するまで3秒間待つようになります。

smtp_transport_rate_delay = 3s とすれば smtp 配送だけに効果があります。

transport_maps と master.cf の設定をうまく使えば特定のドメイン宛だけ遅延させることもできると思います。

次は default_transport_rate_delay = 3s とした状態で、メールをほぼ同時に5通送った時の配送ログです。 約3秒間隔で配送されていることがわかります。

Mar  7 00:31:03 x220 postfix/smtp[29564]: 10D0610A: to=<tmtms@example.com>, relay=mx.example.com[49.212.128.207]:25, delay=3.8, delays=0.08/3.4/0.14/0.17, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as AA13B9FCBF)
Mar  7 00:31:03 x220 postfix/qmgr[29553]: 10D0610A: removed
Mar  7 00:31:07 x220 postfix/smtp[29564]: 6AD316EF: to=<tmtms@example.com>, relay=mx.example.com[49.212.128.207]:25, delay=6.7, delays=0.09/6.3/0.14/0.19, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 046759FCBF)
Mar  7 00:31:07 x220 postfix/qmgr[29553]: 6AD316EF: removed
Mar  7 00:31:10 x220 postfix/smtp[29598]: BD2BC1A0E: to=<tmtms@example.com>, relay=mx.example.com[49.212.128.207]:25, delay=9.7, delays=0.12/9.3/0.14/0.17, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 522C19FCBF)
Mar  7 00:31:10 x220 postfix/qmgr[29553]: BD2BC1A0E: removed
Mar  7 00:31:13 x220 postfix/smtp[29564]: 164231AA5: to=<tmtms@example.com>, relay=mx.example.com[49.212.128.207]:25, delay=13, delays=0.12/12/0.14/0.17, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 9E3459FCBF)
Mar  7 00:31:13 x220 postfix/qmgr[29553]: 164231AA5: removed
Mar  7 00:31:17 x220 postfix/smtp[29598]: 642CC1CE2: to=<tmtms@example.com>, relay=mx.example.com[49.212.128.207]:25, delay=16, delays=0.12/15/0.14/0.18, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as EA5DD9FCBF)
Mar  7 00:31:17 x220 postfix/qmgr[29553]: 642CC1CE2: removed