それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Postfixでコマンド実行をする。メールが届いたら処理をする。

メールが届いたら処理をする。をPostfixでやろうと思った。理由は簡単メールは配送キューの仕組みがあるからだ。

ジョブキューサーバーとか設定覚えるの面倒だし。ジョブキュー失敗したらメールとか再送信とか設計面倒。

MTAで全部やったらいいじゃん

という悪魔の囁きが聞こえました。

メールサーバーなら簡単、ジョブキューの代わりにメールキューがあるし、該当サーバーまでの配送経路はメールアドレスで簡潔に記述できるし。なんでみんなやらないの・・・

Postfixのインストール。

sudo aptitude install postfix

これでメールサーバーは準備完了。

メールが届いたら、コマンドを実行する。

やり方は色いろあるんですが。。。

とか、まぁいっぱいあるけど、今回は手早くやりたかったのでalias

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 = catchalluser
Postfixでvirtualを使わずにキャッチオールアドレスを設定する | トリアエズぶろぐ

これでCatch-ALLつくって、送信先アドレスと、タイトルで、ジョブの種類を判別して、分けた。

ジョブリレー

ジョブのリレーだって簡単。

  1. メールが届く
  2. キャッチオールアドレスに転送
  3. Rubyスクリプト走る。
  4. メアドとタイトルで処理を決めてジョブ実行
  5. 終了したら、終了メールを返信する。

が基本流れなので、5:終了メール返信⇛ 5:別ジョブのメールを送信 とすれば行けば、次のジョブがまた1から始まる。

面倒だったジョブネットだってある程度書ける。


ジョブごとにメアドか、メールサーバー上げておけばいいし、メールサーバー止まったって、メールは再送信キューに入るだけだから。
適当で動いてる。

なんか便利。

ただ、面倒なのはジョブがどれだけ溜まってるか見るのが面倒なだけ。。。とくにちゃんとスクリプトが起動しているか、STDINから入ってくるメール本文をデバッグするのが面倒だった。設定は楽だけど、エラー捕まえるのが面倒だった。