2026年10月2日
2026年10月2日
Postfixのキューを確認・管理する方法|postqueue・postcat・postsuperの使い方
Postfix は、すぐに配送できなかったメールをキュー(送信待ちの列)に入れ、時間をおいて再送します。メールが届かない、送信が遅れている、サーバーから大量のメールが出ているといったときは、まずキューの中身を確認すると原因の見当が付きます。
この記事では、キューの確認と管理に使う次の3つのコマンドを説明します。
| コマンド | 主な用途 | 実行するユーザー |
|---|---|---|
postqueue |
キューの一覧、再送の指示 | 一覧は一般ユーザーでも可 |
postcat |
キューに入っている1通の中身を表示 | root |
postsuper |
削除・保留・保留の解除・再キュー | root |
コマンドと出力は、2026年10月時点の Debian 13 の Postfix 3.10 で確認しています。
キューの種類
Postfix のキューは /var/spool/postfix/ の下のディレクトリーに分かれています。ファイルを直接消したり動かしたりせず、この記事のコマンドで操作します。
| キュー | 入っているメール |
|---|---|
maildrop |
ローカルの sendmail コマンドから投入された直後のメール |
incoming |
受け付けて、配送の準備をしているメール |
active |
いま配送しようとしているメール |
deferred |
一時的なエラーで配送できず、再送を待っているメール |
hold |
管理者が保留にしたメール。解除するまで配送されない |
corrupt |
壊れていて読めないキューファイル |
「キューにたまっている」というときは、ほとんどの場合 deferred のメールのことです。
キューの一覧を見る
postqueue -p
mailq でも同じ結果になります。出力は次のようになります。
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
949F63B5C1 285 Thu Oct 29 17:36:33 sender@mail.example.test
(connect to 127.0.0.1[127.0.0.1]:2525: Connection refused)
alice@example.net
9AF003B5C2 285 Thu Oct 29 17:36:33 sender@mail.example.test
(connect to 127.0.0.1[127.0.0.1]:2525: Connection refused)
bob@example.net
-- 0 Kbytes in 2 Requests.
- 1行目:キュー ID、サイズ(バイト)、キューに入った日時、差出人
( )の行:配送できなかった理由(遅延の理由)。原因を探すときに最も役立つ部分です- 最後の行:宛先
キュー ID のすぐ後ろに記号が付くことがあります。
| 記号 | 意味 |
|---|---|
* |
active キューにあり、配送中 |
! |
hold キューにあり、保留中 |
# |
postsuper -e などで期限切れにされた(次の配送の試みで差出人に返される) |
| なし | deferred などで再送を待っている |
最後の行が -- 0 Kbytes in 2 Requests. のようにメールの数を示します。空なら Mail queue is empty と表示されます。
JSON形式で一覧を見る
postqueue -j は、1通ごとに1行の JSON で出力します。スクリプトで扱うときはこちらが便利です。
postqueue -j
{"queue_name": "deferred", "queue_id": "949F63B5C1", "arrival_time": 1793295393, "message_size": 285, "forced_expire": false, "sender": "sender@mail.example.test", "recipients": [{"address": "alice@example.net", "delay_reason": "connect to 127.0.0.1[127.0.0.1]:2525: Connection refused"}]}
jq を使うと、キューごとの件数や、遅延の理由ごとの件数を数えられます。
# キューごとの件数
postqueue -j | jq -r .queue_name | sort | uniq -c
# 遅延の理由ごとの件数(多い順)
postqueue -j | jq -r '.recipients[].delay_reason' | sort | uniq -c | sort -rn | head
宛先のドメインごとに数える
qshape は、キューのメールを宛先ドメインごと・経過時間ごとに集計します。特定のドメイン宛てだけがたまっているかどうかを確かめるときに使います。
sudo qshape deferred
T 5 10 20 40 80 160 320 640 1280 1280+
TOTAL 3 3 0 0 0 0 0 0 0 0 0
example.net 2 2 0 0 0 0 0 0 0 0 0
example.org 1 1 0 0 0 0 0 0 0 0 0
T が合計、その右の数字が経過時間(分)ごとの件数です。qshape は Debian / Ubuntu では postfix パッケージに含まれています。
1通の中身を見る
sudo postcat -q 949F63B5C1
エンベロープ(差出人・宛先)、ヘッダー、本文がまとめて表示されます。一部だけを見たいときは、次のオプションを -q の前に付けます。
| コマンド | 表示する部分 |
|---|---|
sudo postcat -hq キューID |
ヘッダーだけ |
sudo postcat -bq キューID |
本文だけ |
sudo postcat -eq キューID |
エンベロープだけ |
迷惑メールの踏み台にされていないか調べるときは、ヘッダーの Received: や From: を確認します。サーバー上のプログラムが sendmail コマンドで投入したメールには、Received: by mail.example.test (Postfix, from userid 0) のように投入したユーザーの ID が記録されます。Web サーバーのユーザー(Debian / Ubuntu の www-data は通常 33)になっていれば、WordPress などの PHP から送られたメールだと見当が付きます。
メールの中身には個人情報が含まれます。調査に必要な範囲だけを見るようにしてください。
キューを操作する
今すぐ再送する
# キューのすべてのメールの配送を今すぐ試みる
sudo postqueue -f
# 特定の1通だけ今すぐ配送を試みる
sudo postqueue -i 949F63B5C1
deferred のメールは、通常は時間をおいて自動で再送されます。原因(DNS、相手のサーバーの停止、ファイアウォールなど)を直したあとに、待たずに再送したいときに使います。配送できないメールが多い状態で postqueue -f を繰り返すと、ほかのメールの配送も遅くなるので、原因を直してから実行します。
保留にする・保留を解除する
# 保留にする(hold キューに移す)
sudo postsuper -h 949F63B5C1
# 保留を解除する
sudo postsuper -H 949F63B5C1
保留にしたメールは、解除するか削除するまで配送も期限切れもしません。迷惑メールの可能性がある送信を、消す前にいったん止めておきたいときに使えます。
削除する
# 1通を削除する
sudo postsuper -d 949F63B5C1
# deferred キューのメールをすべて削除する
sudo postsuper -d ALL deferred
# キューのメールをすべて削除する
sudo postsuper -d ALL
削除したメールは元に戻せず、差出人にもエラーメールは返りません。ALL を使う前に、postqueue -p で何が消えるのかを確認してください。
宛先や差出人を指定してまとめて削除する
postsuper -d - は、標準入力からキュー ID を読み込んで削除します。postqueue -j と jq で対象を絞り込んで渡すと、特定の宛先や差出人のメールだけを削除できます。
# 宛先が bob@example.net のメールを削除する
postqueue -j \
| jq -r 'select(any(.recipients[]; .address == "bob@example.net")) | .queue_id' \
| sudo postsuper -d -
# 差出人が spam@example.com のメールを削除する
postqueue -j | jq -r 'select(.sender == "spam@example.com") | .queue_id' | sudo postsuper -d -
先に | sudo postsuper -d - を外して実行し、表示されたキュー ID が意図したものかを確かめてから削除すると安全です。
期限切れにして差出人に返す
sudo postsuper -e 949F63B5C1
-e は、メールを期限切れの扱いにします。次の配送の試み(postqueue -i などで促せます)で配送をあきらめ、差出人にエラーメールが返されます。削除と違い、差出人は届かなかったことを知ることができます。
再キューする
sudo postsuper -r 949F63B5C1
sudo postsuper -r ALL
-r は、メールをキューに入れ直し、アドレスの書き換えや転送先の判定をやり直させます。relayhost や transport_maps などの設定を変えたあと、たまっているメールにも新しい設定を使わせたいときに使います。
再送の間隔と保持期間
deferred のメールがどのくらいの間隔で再送され、いつあきらめられるかは、次の設定で決まります(値は Postfix 3.10 の初期値)。
| 設定 | 初期値 | 意味 |
|---|---|---|
queue_run_delay |
300s |
deferred キューを確認する間隔 |
minimal_backoff_time |
300s |
再送までの最短の待ち時間 |
maximal_backoff_time |
4000s |
再送までの最長の待ち時間 |
maximal_queue_lifetime |
5d |
この期間を過ぎても配送できないメールは差出人に返す |
bounce_queue_lifetime |
5d |
エラーメール(バウンス)自体をキューに置いておく期間 |
今の値は postconf で確認できます。
postconf maximal_queue_lifetime bounce_queue_lifetime queue_run_delay minimal_backoff_time maximal_backoff_time
キューがたまっていないか定期的に確かめる
キューの件数が一定を超えたらログに記録する簡単なスクリプトです。/usr/local/bin/postfix-queue-check.sh として保存します。
#!/bin/bash
# Postfix のキューの件数が LIMIT を超えたら、ログに記録して終了コード 1 で終わる
LIMIT=50
COUNT=$(/usr/sbin/postqueue -j | wc -l)
if [ "$COUNT" -gt "$LIMIT" ]; then
/usr/bin/logger -t postfix-queue-check "queue has $COUNT messages (limit $LIMIT)"
exit 1
fi
sudo chmod 755 /usr/local/bin/postfix-queue-check.sh
sudo crontab -e で、10分ごとに実行するように登録します。
*/10 * * * * /usr/local/bin/postfix-queue-check.sh
記録は journalctl -t postfix-queue-check で確認できます。メールの送信自体が止まっていることもあるので、通知が必要な場合は、メール以外の手段(チャットの Webhook や外部の監視サービス)を使います。
よくある遅延の理由
postqueue -p の理由の例 |
考えられる原因 |
|---|---|
connect to ...:25: Connection timed out |
送信側から 25 番ポートへの接続が止められている(クラウドや回線の OP25B)、相手のサーバーが応答しない |
connect to ...: Connection refused |
相手のサーバーやリレー先がそのポートで待ち受けていない |
Host or domain name not found |
宛先ドメインの MX / A レコードを引けない(ドメインの綴り間違い、DNS の障害) |
451 4.7.1 ... try again later など |
相手のサーバーが一時的に拒否している(グレーリスティング、送信量の制限) |
原因を直したら sudo postqueue -f で再送し、postqueue -p で減っていくことを確かめます。配送の経過はメールのログ(Debian / Ubuntu は /var/log/mail.log、RHEL 系は /var/log/maillog、rsyslog がない環境は journalctl)でキュー ID を検索して追えます。
まとめ
postqueue -p(mailq)で一覧と遅延の理由を見る。スクリプトではpostqueue -jとjqを使うqshape deferredで、どのドメイン宛てがたまっているかを確かめるpostcat -qで1通の中身を見る(-hヘッダー、-b本文)postsuperで削除(-d)、保留(-h/-H)、期限切れ(-e)、再キュー(-r)を行う。-d -で絞り込んだメールだけをまとめて削除できる- 原因を直してから
postqueue -fで再送する
関連記事: