uzullaがブログ

uzullaがブログです。

PHPでメール連携の話

空メールにかぎらないですが、メールを受け取ってなにか処理をする、というのは非常に良くある話しで、ガラケー消滅にともなって消えるかなーって思ってたけど、なんと至高のスマートフォンであるところのiPhoneが input type='file' をサポートする気ゼロで、まだまだ生き残りそうですよねーという昨今ですね、こんばんわ。

空メール受信を何の言語で書くか

ウェブでよく使われる言語ならなんでも大丈夫だと思います。
秒間何百通もとどいちゃうような化け物サイトはともかく、せいぜい一分に一本程度の受信であれば、aliasesとかにプログラムを書いておいてpipeで起動するでしょう。
私はウェブ側とPHPで書く仕事が多いので、ここもPHPで書く事が多いですね(モデルを使い回せるので)

examの話し

sendmailもどきのexamなんですが、まあ大体sendmailと同様に使えます。/etc/aliasesに記述して、特にnewaliasesはいらないみたいです。
(なにこれ意味のない情報っておもうでしょうが、メモなので)

mailme: "|/path/to/mail_import.php"

まあこんな感じですよね。

空メール受信するPHPについて(この節がこのエントリで書きたい所です)

普段通りの、ウェブ用のPHPではダメです。(ダメっていうか、面倒な事になります)

#!/usr/bin/php -q
<?php
chdir( '/path/to/' );
ini_set('error_log','/path/to/php.log');

これを先頭に入れておくと、はかどりますね。
当然chmod +xはしておいてください。
また、?>で最後を閉じないようにしましょう。
あー後、Windowsとかいうものを強制されて使っている人は*1、改行コードに気を付けてください。


一応簡単に説明すると、
1行目は、phpをシェルから実行プログラムとして呼び出す為に(PHPへのPathは環境に応じて変えましょう)
3行目は、絶対パスで起動すると、カレントディレクトリがかわってしまい、require_onceとかがコケますので再設定します。
4行目は、phpの出すエラーログをメールサーバーは受け取ってくれませんので、別に指定しておきましょう

この辺りは、起動する所で色々気をつければ設定不要っちゃ不要なのですが、プログラム側でかいちゃったほうがスッキリしますね。


特に4行目は重要です。普段はあまりメジャーではない設定ですが、メールサーバーからプログラムを起動させると、どこでコケてるのかマジでわからなくて、Printfデバッグに数時間とかかける羽目になりますので最初から設定したほうがいいですね。
こういうケース以外でも、設定しておけば、うわものを誰もメンテしてなくて、404エラーが大量にでてerror_logが洪水のようになっている人気サイト(検閲)でもわりとデバッグしやすくなりますし、「ディスク容量の問題からerror_logを取得していない」とかドヤ顔で言ってくる(検閲)オモシロ業者に頭をさげずにすみます。


どうでもいいですけど、今後<?phpじゃなくて、<?になるらしいですね。ShorttagがデフォルトOnで、しかもOffにできなくなるという。
いままで高尚なPHPerの金言を守り、<?= $var ?>を必死に<?php echo $var; ?>とか書いていた時間を返して欲しいです…。
まあ、そもそもがテンプレート言語ですし、個人的には楽になるのはなんでも歓迎しますが!

メールをパースするライブラリについて

メールはeml形式でSTDINにぶちこまれてきますので、それをパースしないといけませんね。
まあ、Fromを取り出すだけなら正規表現でも有りかもしれませんが、苦行以外の何者でもないので普通ライブラリを使います。
特に、画像を添付して、それをサーバーで取り出すみたいな場合に、自前でどうにかするのは才能の無駄遣いです。


私は、PHPではQdmailReceiverをお勧めしておきます。
正直、これもそのままだと互換性問題がちらほらあるんですけど、ググるとよくでてくるMail_mimeDecodeより私はお勧めします。


ただ、繰り返しますが、このQdmailReceiverは完璧じゃないです。よくある所で、mail.appの添付ファイルがうまく処理できないとか、添付ファイルのファイル名の取り扱いが変とか色々有ります。
まあ大抵ちょっとした正規表現の互換性(というか、メーラー側の実装のゆらぎ)をなおしていくだけなので、手なおしながら使いましょう。


…こういう所(修正をアドホックにおこなって、バックポートせず、人類の繁栄に貢献しない所)がPHPerのダメな所だ!といわれますが、まったくそうですね。

権限について

メールサーバーから起動されるプログラムの権限は多様です。
ちゃんと上位ディレクトリからそのプログラムを設置してあるディレクトリまでたどれるか(ディレクトリの実行権限があるか)、ファイル書き出しなどあれば、その権限はあるかちゃんとチェックしましょう。


あと、まれーに、意識の高いサーバーにおいては、MTAからのシェル起動に制限をかけていたりします。管理人に「悪いようにはしねぇからさあ、ヘヘヘ」とかいって解除してもらいましょう。

*1:えっ、好きでつかってるんですか?変わってますね