postfixでスクリプトを動かしてあれこれ


あらまし

SLP_KBIT Advent Calendar 2016 - Qiita の11日目の記事のです。

すでに社畜と化したておくれは、後輩たちに先んじて
堂々と今年のアドベントカレンダーに紛れ込んだ。
連日更新されていくカレンダー。浮かばないネタ。減っていく睡眠時間。
一人晩酌で缶トリハイを飲みながらネタを考える投稿直前。

そして今ココに記事が誕生した。
※なんか新しいツール掘り当てて紹介してくれてるみたいなんで、あえて既存の枯れた技術を使ってこんなことできるよ、というのを紹介します。

こっから本題

使うもの

  • postfix
  • bash
  • 柔軟な発想力と少しのやる気とbashに対する愛しさと切なさと心強さ
  • mikutterをwindows上で動かそうと頑張ってなんとか出来るくらいの試行錯誤できる根気強さ

かんたんに解説

postfixは受けとったメールを振分けますが、その際に一手間加えると
メール受信をトリガーとしてスクリプトを実行できます。
具体的には、/etc/aliasesにちょいちょいっと追記します。

~~~~~~~~~~~~~~~~~
hostmaster:     root
info:           postmaster
marketing:      postmaster
sales:          postmaster
support:        postmaster


# trap decode to catch security attacks
decode:         root

# Person who should get root's mail
#root:          marc

--- ここまでデフォルト ---
<以下追記>
mail_get:   |"/usr/bin/bash /tmp/sample.sh"

/etc/aliasesはnewaliaseするとdbが更新されて、
新しい設定で動作します。

# newaliases

試しに以下のコマンドを投げます。

$ mail -s test mail_get@localhost
hogehoge
test mail
.

root@localhost宛に、件名が「test」、本文が↓のようなメールを送信します。
hogehoge
test mail
.

さてどうなったかを確認します。

[root@localhost tmp]# cat sample.sh
#!/usr/bin/bash
OUTFILE="/tmp/mail_get.log"

while read line; do
        echo $line >> ${OUTFILE}
done
[root@localhost tmp]# mail -s test mail_get@localhost
hogehoge
test mail
.
EOT
[root@localhost tmp]# ls *.log
mail_get.log                                                                  [root@localhost tmp]# cat mail_get.log
From [email protected] Sat Dec 10 22:37:01 2016
Return-Path: <[email protected]>
X-Original-To: mail_get@localhost
Delivered-To: [email protected]
Received: by localhost.localdomain (Postfix, from userid 0)
id 7EC1586933B0; Sat, 10 Dec 2016 22:37:01 +0900 (JST)
Date: Sat, 10 Dec 2016 22:37:01 +0900
To: [email protected]
Subject: test
User-Agent: Heirloom mailx 12.5 7/5/10
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Message-Id: <[email protected]>
From: [email protected] (root)

hogehoge
test mail

はい。ヘッダとか全部受け取れてますね。
aliasesに設定されたスクリプトファイルは標準入力として
メールの内容を受け取ることが出来ます。
なので、
* 件名で処理を振分ける
* 本文に実行する処理を書いておく
などは普通に考えられますね。(後者は実行する際の権限がややこしくなるのであまりやりたくないですが)

余談

あくまでお遊びなので/tmp配下でやってるためスクリプト実行できてますが、
実際に動かす際には、権限が適切に設定されていないと動きません。
例えば、nagiosの権限になっているファイルに対して処理をしたい場合であれば、
実行する際のオーナーをnagiosにするかrootである必要があります。
postfixの設定にdefault_privsという項目があり、デフォルトではnobodyになっているため、
受信したメールにより実行されるスクリプトは基本的にはnobodyで実行されちゃいます。
なので、以下のようにします。

[root@localhost] # vim /etc/postfix/main.cf
# default_privs = nobody
default_privs = nagios

[root@localhost] # systemctl reload postfix

ちなみにここにrootやpostfixは設定不可です。

まとめ

  • 新しいツール発掘して見聞きするのは大切だしとても良いこと
  • 同じくらい既存のものにも目を向けて、車輪の再発明を最低限ですませたいよね
  • 枯れた技術は応用次第で大体やりたいことができる
  • bash(シェルスクリプト)はつよい