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 で再送する

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ
▲