2025.03.28

メール受信時にプログラムを実行したい

最近、メールチェックのプログラムを作成して、SPAM メールをゴミ箱に振り分けるようにしてみました。
このプログラムを、cron で10秒毎に実行しているのですが、受信のタイミングによっては全く効果なし。
もっと短い時間で実行してやろうか、とも思いましたが、そもそも cron での定時実行自体がスマートではなく、やっぱりメール受信時にリアルタイムで実行するのが最適です。

というわけで、「inotify」というツールを使用し、メール受信時にプログラムが実行できるようにしました。

目次出力

環境

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)についてはまた別の機会に書こうかと思います。