2025.03.28
メール受信時にプログラムを実行したい
最近、メールチェックのプログラムを作成して、SPAM メールをゴミ箱に振り分けるようにしてみました。
このプログラムを、cron で10秒毎に実行しているのですが、受信のタイミングによっては全く効果なし。
もっと短い時間で実行してやろうか、とも思いましたが、そもそも cron での定時実行自体がスマートではなく、やっぱりメール受信時にリアルタイムで実行するのが最適です。
というわけで、「inotify」というツールを使用し、メール受信時にプログラムが実行できるようにしました。
目次出力
環境
- almalinux 9
- postfix
inotify とは
inotify は、Linuxカーネルに組み込まれたファイルシステム監視機能です。
特定のディレクトリやファイルで、新規作成、変更、削除などのイベントが発生した際に、リアルタイムで検知することができます。
inotify をインストール
sudo dnf install inotify-tools
inotify を使用してイベントを監視するシェルスクリプトを作成
メール受信時に PHP を実行するようにします。「メール受信」というよりは、「受信フォルダに新しくファイルが作成された」というイベントを監視。
/home/ユーザ名/scripts/mail_check.sh
#!/bin/bash
WATCH_DIR="/home/ユーザ名/Maildir/new"
PHP_SCRIPT="/usr/local/sbin/check_mail.php"
while inotifywait -e create "$WATCH_DIR"; do
php "$PHP_SCRIPT"
done
サービスとして実行させる
手動で実行しても良いのですが、再起動時にも自動で起動できるようにサービスとして実行するようにしました。
ユニットファイルを作成。
/etc/systemd/system/mailcheck.service
[Unit]
Description=Inotify Mail Monitor Service (Mail Check)
After=network.target
[Service]
Type=simple
ExecStart=/home/ユーザ名/scripts/mail_check.sh
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
サービスとして実行します。
# ユニットファイルの再読込み
sudo systemctl daemon-reload
# サービス起動
sudo systemctl start mailcheck.service
# ちゃんと起動できたか確認
sudo systemctl status mailcheck.service
# 自動起動設定
sudo systemctl enable mailcheck.service
実際に呼び出される、メールチェック用の PHP スクリプト(check_mail.php)についてはまた別の機会に書こうかと思います。