Postfix起動・再起動時にやるべきこと
- 掲載日
- 更新日
結論
まず、postqueueコマンドで、キューに未送信のメールが溜まっていないか確認します。
(これを放置したままpostfixを起動すると、キューに溜まっているメールが全件送信されます。)
# postqueue -p
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
ABC0123012 1000 Sat Mar 21 01:50:00 from@example.com
to@example.com
...必要に応じて、postcatコマンドでメールの内容を確認します。
# postcat -q [Queue ID: ※ postqueue -p コマンドで出て来る一番左側のID(上記の場合、ABC0123012)]
(略)
sender: from@example.com
(略)
To: to@example.com
(略)
メール本文
メール本文
メール本文
(略)上記のような内容が出て来るので、送り元(sender)、送り先(To)、何より本文をよく確認します。
(大事なメールは絶対に消さない+最悪消しても手動で送り直せるようにバックアップを取っておきましょう。)
そして以下のケースに合わせて対応します。
量が大量の場合、不要なメールは削除する
システムのエラー検知メール等を送っている場合、同じアドレス宛に数百件のメールが溜まっていることがあります。その状態でpostfixを起動すると、数百件が一気に送信されるのでよろしくありません。
(社内宛等なら笑い話で済むケースもありますが、社外に出していると大変なことになりますので、急いでいても最低限postqueue -pで件数を確認しましょう。)
エラー検知メールであれば本文の文言が定型であったり、送り元アドレスをそれように変える等していると思いますので、それをもとにgrepして古いメールのqueue idを収集します。
収集したIDを以下のコマンドで削除しておき、最新のメールだけを送信するようにします。
(ここは実際の運用に合わせて対応しましょう。)
# postsuper -d [Queue ID: ※ postqueue -p コマンドで出て来る一番左側のID(上記の場合、ABC0123012)]なお、検証段階などで特に気になるメールがないのであれば以下のコマンドで一気に消し去ることも可能です。
(※使用は自己責任で)
# postsuper -d ALL経緯
仕事で構築したサーバーで、稼働後にメールが届いてないという問い合わせがありました。maillogを調べたら以下のようなエラーが出ていました。
warning: unable to look up public/pickup: No such file or directory調べると、postfixが起動していないときに出るエラーのようです。(チェック体制に問題ありなのですが、それはまた別の話。)
構築中なら何も考えず、systemctl start postfix(必要に応じて systemctl enable postfixも)してもいい(場合によっては良くない)ですが、問題は既に稼働しているサービスであるということ。
既に利用者間でメールの送受信が行われていたため、何も考えずに再起動すると、本来なら何日も前に送るべきだったメールが今日いきなり顧客に届く、ということになりかねません。(Amazonとかのお買い上げメールが10日後とかに来たらおかしいですよね。)
よって、結論にある通り、まずpostqueue -pコマンドでキューを確認し、送信待機中のメールがあるかを確認します。
アドレスを見て、顧客に送信するようなメールであればpostcat -q [Queue ID]コマンドでメールの内容を確認します。
中身を見て不要なメールであれば、postsuper -d [Queue ID]コマンドで削除し、必要なデータ(送信したいデータ)はそのままにしておきます。
データは必要(メール不達の謝罪メールを送る等)な場合、postqueueコマンドの内容と、念のためpostcatコマンドの内容をバックアップの上削除します。
(この辺りは運用にもよるので、社内で共有してよくよく確認しましょう。)
最後にサービスを再起動して完了です。
# systemctl start postfix.service
or
# systemctl restart postfix.servicemaillogを見て、以下の点も確認しておきましょう。
- メールは送信されたか。
mailogでstatus=sent (250 2.0.0 Ok: queued as XXXX)のように表示されていれば「少なくとも自分のサーバーからは」送信出来てます。
相手の方でセキュリティ等で引っかかっている可能性もありますので、必要に応じて確認しましょう。
public/pickupって何?
今回気になったのが、最初に出てきたエラーメッセージ。
warning: unable to look up public/pickup: No such file or directory直訳すると、「public/pickupというファイルもしくはディレクトリが見つからないよ」というエラーメッセージですが、肝心のpublic/pickupが何なのかが分からない。(この文言で検索するとpostfixが起動していないときに出るエラーということしか分からない。)
まずこのpublic/pickupがどこにあるのか調べると、通常/var/spool/postfix/配下にあるようです。
しかしこれが何で、サービス起動してないとなぜ存在存在しないものなのかこれが分からない。
Postfixのアーキテクチャを見てみると、以下のように書いてあります。
- Local submissions are received with the Postfix sendmail(1) compatibility command, and are queued in the maildrop queue by the privileged postdrop(1) command. This arrangement even works while the Postfix mail system is not running. The local pickup(8) server picks up local submissions, enforces some sanity checks to protect Postfix, and gives the sender, recipients and message content to the cleanup(8) server.
リンク先の図とあわせて解読していくと、
まず、sendmail(1)コマンドを実行すると、ローカル送信が行われ、postdrop(1)コマンドでmaildropキューに格納されます。
ここまではPostfixサービスが止まっていても動くようです。
そのローカル送信を、pickup(8)サーバーで受け取り、諸々チェックを行って送受信者や本文内容をcleanup(8)サーバーに送って、図の経過を辿ってメールが外に送信されるということっぽい?
サービスを起動すると、pickup デーモンが動き出し/var/spool/postfix/配下にpublic/pickupが作成されます。(Unixソケットが云々という話らしいです。この辺も追々深堀したい。)起動していないとpublic/pickupが作成されていないのでこのエラーが出るという事なのだと思われます。
なので、Postfix起動後に何らかの問題でサービスが停止した状態でメールが送られた場合、public/pickupは存在自体はしてるはずなので別のエラーメッセージが出て来そうと思い、以下の手順で確認。
- テスト用のサーバーで
systemctl stop postfix.serviceコマンド実行 - 以下のコマンドでメールを送ってみる
echo 'Test' | sendmail example@example.com -f example@example.com - maillogを見てみると、
warning: unable to look up public/pickup: No such file or directoryエラーメッセージが表示されていない。
よって、稼働後に何かあって停止しても同じエラーメッセージにはならなさそう。
あくまで構築時の起動忘れ等が原因の時だけ出て来るメッセージのようです。
まとめ
postfixを起動・再起動する時は、
- 溜まったメールが無いか(起動時に送信されるメールがあるか)キューを確認する
- メールがあれば送り元と宛先、内容を確認し、必要に応じて削除 or そのままにしておく
- 送信するメールがある場合、よく確認の上起動・再起動する
- そもそもサービス起動忘れなんてしないようチェック体制を組んでおく
参考

この記事を書いた人
- A.W.
- 茨城県在住Webエンジニアです。 PHP、PostgreSQL、Linuxなどを業務で使用しています。 趣味ではGoやNuxt、Flutterをやってます。