- .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・山崎はるか)