- .forwardでPHPを起動する -
メール到着と同時に、ただちにCGI(Perlやruby、PHP)を実行したい場合がある。
たとえば、到着したメールを すべてデータベースに入れたり、あるいは、掲示板に表示したりなど。
これを実装するには、SendmailやPostfixの場合は .forward に パイプ処理を書く。qmailの場合は .qmail
に書く。
それを ユーザーディレクトリに置いておけば、メール到着と同時に 指定したプログラムが実行される。
ただ 書籍やネットの記述では 「そのようにして プログラムを実行できる」と書いてあるだけで、具体的に
到着したメールの中味をどう処理するのか、までは述べられていないことが多い。(少なくとも 私自身は まだ お目にかかったことがない)
なので、当メモにて、もうちょっと具体的なソースを書いておくことにする。
OSは FreeBSD6.2 ・・・なのだが 別に 他のOSでも たいして変わらんと思う。
MTAは Sendmail または Postfix
CGIプログラムは、わかりやすく PHPを用いる。
なお サンプルソースの縮小のためPEARを用いているが、ごらんの通り、これはメールヘッダーの分割化に使用しているだけなので、なくても代替方法は
すぐにおわかりかと思う。
念のため、PEAR を使用しない場合の 代替ソースを コメントで書いた。
<?php require_once("Mail/mimeDecode.php"); // PEAR MimeDecode → # pear install Mail_Mime してるか確認 mb_language('ja'); mb_internal_encoding("utf-8"); // メール取得 if ( ($stdin=fopen("php://stdin",'r')) == true ){ while( !feof($stdin) ){ $line .= fgets($stdin,4096); } } fclose($stdin); // この時点で $line に メール全体がとれてるので、eml形式で そのまま保存することもできる // $fp = fopen("file1.eml","w"); // fputs($fp,$line); // fclose($fp); // PEARを使用しない場合 // ヘッダー分離 //$head = substr($line,0,strpos($line,"\n\n")); //$m_headers = split('\n',$head); // 本文抽出 //$m_body = trim(strstr($line,"\n\n")); // 文字コンバート //$m_body = mb_convert_encoding( $m_body, "UTF-8", "JIS" ); // PEAR を使った処理 $decoder = & new Mail_mimeDecode( $line ); // MIMEを分解 $parts = $decoder->getSendArray(); list( $recipients, $headers, $body ) = $parts; // メールの内容 (タイトル・送信者・メール本文) $subject = mb_decode_mimeheader( $headers['Subject'] ) ; $from = mb_decode_mimeheader( $headers['From'] ) ; $m_body = trim(mb_convert_encoding( $body, "UTF-8", "JIS" )); ?>
(2007/11/16・山崎はるか)