Aruyo

受信したメールをPHPで処理する

マルチポスト用メールブログをこつこつと日曜大工で作っちゃおう企画。 携帯電話からのアップロードに難*1があったので、どうしよっかなー などど思案した結果、PHPでメールボックスを監視して自動登録しか思いつかず、CRONを使って定期的に確認しようと思っていたのだけど。 しかし、やっぱりメール受信をトリガーにしてPHPを実行する方法がサーバ負担も無くてよいかなぁ、と思い直してさっそくやってみた。

まずは、foobar@domain.jpのメールボックスを作る。 次に、ウェブの適当な所にサンプルのfoobar.phpを設置。 今回は /home/ACCOUNTNAME/www/ 直下に置く。 中身はテーゲーに mail() で送信するだけ。 テストなんでそんなもんで良いかと。 foobar.phpにブラウザでアクセスしてみてメールが届けばok。

そんでもって、.mailfilterをサーバに直接記述。 Telnetでも良し、localに適当な名前で作ってFTPであげて名前を変えても良し。 サーバー上にファイルを作れたり直接編集できるFTPツールだと良いね。 WindowsだとEmFTP+EmEditorしか使った事が無いのでよく知らないけど、何でも出来ると評判の秀丸とかならきっと簡単にできちゃうんだと勝手に推測。

.mailfilterの設置場所はfoobar@domain.jpのMailBox内。 MailBoxをFTPで覗けないレンタルサーバーだとまた違う方法にしないとダメ。 パーミッションは600で。 これ以外も試してみたけど動かず。 中身はこんな感じ。

to "| /usr/local/bin/php /home/ACCOUNTNAME/www/foobar.php"

もし、foobar.phpのパーミッションを755にしてそのまま動くなら /usr/local/bin/php は要らないかも。 私は 554 5.3.0 unknown mailer error 127 が出て foobar.php : not found だったので、こちらの方法にしてみた。

まあ、やってみたらあっさりうまくいきやがんの。 この前までの悩みはなんだったのやら。 この勢いで、携帯からの投稿をぽんぽん受け付けるようにして、あちゃこちゃにクロスポストさせれば第一段階は成功ね。

本当なら携帯の送信フォルダに添付付きがどんどこ埋まってしまうのが嫌だったのですけど、結局メールになっちゃうんよね。 はやいところiPhoneに乗り換えて解決したいわ。 なんてもうau歴1ヶ月でもうこんな事を呟いてる ^_^;

さて、トリガーがうまくいったので今度はダミーメールを発信するだけだったPHPをとりあえずの要件を満たすような動作をさせるところまで。foobar@domain.jp に届いたメールは .mailfilter によりパイプされて、PHP側では fopen('php://stdin', 'r') で取り出す、と。

取り出せた内容はRFC822なソースのままなんで、表題や本文を抽出するなどしてやる必要がある。添付はいったん base64_decode() したものを再び attach し直す等、適宜な処理を施してからクロスポスト先に投げれば良い。投稿先に応じて解像度や画角を処理するのもついでにやってみた。

添付ファイルと本文の区分けをどうしたものか悩んだけど、_NextPart_ を区切りにして読み込みを分けるという不格好でとてもスマートではない処理でお茶を濁すなど。 最適化はまた今度ね ^_^;