メールが届いたら処理をする。をPostfixでやろうと思った。理由は簡単メールは配送キューの仕組みがあるからだ。
ジョブキューサーバーとか設定覚えるの面倒だし。ジョブキュー失敗したらメールとか再送信とか設計面倒。
MTAで全部やったらいいじゃん
という悪魔の囁きが聞こえました。
メールサーバーなら簡単、ジョブキューの代わりにメールキューがあるし、該当サーバーまでの配送経路はメールアドレスで簡潔に記述できるし。なんでみんなやらないの・・・
aliasesでメールアドレスをコマンドに転送する
alias でマッピング する。
# /etc/aliases root: takuya catch: "|/usr/local/bin/catch " sort: "|/usr/local/bin/catch "
とりあえず、ジョブ名の届く先のメアドを作る。 sort@localdomainに投げたら sort が実行される。
マッピングの反映
alias 書いたら反映させる必要がある。
sudo newaliases sudo alias ls strings /etc/aliases.db
配送の設定
ジョブとしてメールが配送されないと意味が無いので、メールが配送される設定を書く
ホストの設定:/etc/postfix/main.cf
30 myhostname = debian_mx 31 alias_maps = hash:/etc/aliases 32 alias_database = hash:/etc/aliases 33 myorigin = /etc/mailname 34 mydestination = my.job.net.example.jp #ここ 35 relayhost = 36 mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 37 mailbox_command = procmail -a "$EXTENSION" 38 mailbox_size_limit = 0 39 recipient_delimiter = + 40 inet_interfaces = all
virtualでもやってみる。
localドメインと外部ドメインとの変換
/etc/postfix/virtual catch@my.job.net.example.com catch@localhosh
virtualの反映
sudo strings /etc/postfix/virtual.db sudo postmap /etc/postfix/virtual sudo strings /etc/postfix/virtual.db
ジョブの種類ごとにメアド増やすの面倒だったので
#local_recipient_maps = ↓ #を取る local_recipient_maps = # ユーザが該当しないメールはユーザcatchalluserに送る luser_relay = catchalluserPostfixでvirtualを使わずにキャッチオールアドレスを設定する | トリアエズぶろぐ
これでCatch-ALLつくって、送信先アドレスと、タイトルで、ジョブの種類を判別して、分けた。
ジョブリレー
ジョブのリレーだって簡単。
- メールが届く
- キャッチオールアドレスに転送
- Rubyスクリプト走る。
- メアドとタイトルで処理を決めてジョブ実行
- 終了したら、終了メールを返信する。
が基本流れなので、5:終了メール返信⇛ 5:別ジョブのメールを送信 とすれば行けば、次のジョブがまた1から始まる。
面倒だったジョブネットだってある程度書ける。
ジョブごとにメアドか、メールサーバー上げておけばいいし、メールサーバー止まったって、メールは再送信キューに入るだけだから。
適当で動いてる。
なんか便利。
ただ、面倒なのはジョブがどれだけ溜まってるか見るのが面倒なだけ。。。とくにちゃんとスクリプトが起動しているか、STDINから入ってくるメール本文をデバッグするのが面倒だった。設定は楽だけど、エラー捕まえるのが面倒だった。