メール受信で php スクリプトを起動する

メールを受信したら、その内容を解釈して処理するための方法。
処理するのは php スクリプト。

受信したメールを処理するスクリプトは hoge.php とする。
ホームディレクトリ直下に置いてあるものとする。


まず、ホームディレクトリにこのような .forward を作る。

.forward
"| php hoge.php"

これで、メールを受けとった sendmail が、.forward の中身に沿って処理してくれる。
.forward のアクセス権は、緩いと処理されない場合がある。
644 では動作しなかったが、 600 にしたら動いたというケースがある。

ただし、このままだとエラーになる。
sendmail から起動する場合、smrsh という制限付きのシェルが立ち上がるからだ。
この制限のおかげで、意図せずに sendmail が動作した場合でも、ファイルが消えたりして大変なことになるのが避けられる。

大変なことを避けられるのはよいが、制限がきつすぎて php が起動できないのは問題だ。
そこで、smrsh で、php を許可することにする。

smrsh から起動できるプログラムは、以下のフォルダに格納されている。
/etc/smrsh/

ここに、php のシンボリックを入れておけばよい。
こうすれば、.forward の中で php を起動できる。


受信したメールは、PEAR :: Mail_mimeDecode を使うと便利。
マルチパートでないテキストのメールだったら、こんな感じで処理できる。

require_once 'Mail/mimeDecode.php';

$params = array(
  'include_bodies' => true,
  'decode_bodies'  => true,
  'decode_headers' => true,
  'input' => file_get_contents("php://stdin"),
  'crlf' => "\r\n",
  );
$structure = Mail_mimeDecode::decode($params);

$from = $structure->headers['from'];
$to = $structure->headers['to'];
$subject = $structure->headers['subject'];

switch(strtolower($structure->ctype_primary)){
case "text":
  $body = $structure->body;
  break;
default:
  $body = "";
}

これで、メールから php スクリプトを起動できる。


ちなみに、スクリプトを起動しつつ、メールの転送もしたい、という場合はどうするか。
.forward に行単位で並べていけばよい。

.forward
"| php hoge.php"
piyo@gmail.com
buhi@yahoo.co.jp
このようにしておけば、hoge.php が実行されて、さらに piyo@gmail.com と buhi@yahoo.co.jp にメールが転送される。

2012年11月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

アーカイブ