12月 2009のアーカイブ
メール受信で codeigniter の メソッドを起動する方法
空メールを受信して会員登録用のURLを返信したり、ケータイから画像添付メールを受信して掲示板に投稿させたりと、何かと出番の多い「メールから php プログラムを起動する」 という処理ですが Codeigniter での情報がありませんでしたのでまとめてみます。
元々、Codeigniter の 特定のコントローラーのメソッドを cron で呼び出す為のプログラム(Cron job bootstrapper)は公開されていますので、そんなに難しくはないだろうと思っていたんですが、見事にハマってしまいました…。
なんで Cron として動作させるプログラムが関係あるのか。
ものすごーく単純に考えると Cron として動作させる為には shell(コマンド)として codeigniter の特定のコントローラーのメソッドを呼び出して動作させる仕組みが必要になります。 Cron は、指定した時刻に指定したコマンドを実行するものですが、メール受信でプログラムを呼び出すのも、同じ様にメールを受信したタイミングで指定したコマンドを実行する事から、
たぶん、crontab に書くのと同じ要領で動く。
と考えたのでした。
Cron job bootstrapper のインストール
まずは、Cronjob bootstrapper の wiki ページに掲載されているコードをコピーして適当なファイルに保存します。ここでは、 cron.php として UTF-8/LF にて保存しました。
保存したファイルを動作させる環境にあわせて書き換えをします。
書き換えるのは、
define('CRON_CI_INDEX', '/var/www/vhosts/intranet/index.php'); // Your CodeIgniter main index.php file
このパス指定です。
実際には、その他に@mataga さんのブログ「ヌル日記」の記事「[CodeIgniter][PHP]CodeIgniterの学習 52 – CodeIgniterをバッチとして呼び出せるようにする」を参考にさせて頂き ob_end_flush 部についても変更を行いました。
さらに…
今回設置したサーバーが「さくらインターネット」でしたので、codeigniter を さくらインターネットで動作させている方は変更されているであろう、uri_protocol (QUERY_STRING に設定していませんか?)に合せた編集が必要になります。
wiki に上っているコードは以下のようになっており、ハイライトされている66行目は存在しません。
case '--run': // Simulate an HTTP request $_SERVER['PATH_INFO'] = $value; $_SERVER['REQUEST_URI'] = $value; $_SERVER['QUERY_STRING'] = $value; $required['--run'] = TRUE; break;
従って、–run オプションを指定し起動しても $_SERVER['QUERY_STRING'] に値が無い為、コントローラーが呼びだせずエラーが記録されてしまいます。
必ず、$_SERVER['QUERY_STRING'] = $value; を追加しておきます。
編集が終ったら、このファイルを適当なパス(私は、/home/ユーザー名/ にそのまま設置しました。)に設置し実行権限を付けておきます。
あとは MTA(sendmail とか qmail とか postfix とか!)より、メールを受信した際にプログラムを起動するように設定ファイルを作ります。さくらインターネットの場合は、「/home/アカウント名/MailBox/メールアカウント名」に .mailfilter というファイルを設置する事で受信されたメールからプログラムを起動させる事ができます。
to "| /usr/local/bin/php -q /home/アカウント名/cron.php --run=/mail/pict"
上述の例では、コントローラー: mail の、メソッド: pict が呼びだされて処理されます。 なお、先程のヌル日記の記事にもあるように、このメソッドがブラウザから呼びだされて実行されないように、ちょっとした細工が必要になります。詳細については、ヌル日記の該当記事の追記をご覧ください。
あとは、メソッド中での処理は通常の php と、通常の codeigniter の処理と同じ様に書く事ができます。