gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

後で推敲する用memo:空メールを経由するユーザ登録処理

一般的な流れとMagicWeapon特有の処理をだらりんこと。


まず。
(一般)
「ユーザが特定のアドレスに空メールを送る」で、サーバ側で「メール受信を契機にプログラムを起動する」処理を書きます。
例えば、hogera@foo.com にメールを送った場合。
foo.comを持ってるSMTPサーバの、大抵は /etc/aliases あたりに、こんな記述をします。

hogera: | "/usr/local/bin/php /opt/www/hogeramugera/batch/gumomo.php"

これは「hogeraってアドレスにメールが来たら "/usr/local/bin/php /opt/www/hogeramugera/batch/gumomo.php" を実行する」という意味で。
"/usr/local/bin/php /opt/www/hogeramugera/batch/gumomo.php" は「PHP として、/opt/www/hogeramugera/batch/gumomo.php を実行してね」という意味あいです。
実際の細かいパスとかはサーバによって違うので適宜よみかえてちょ。


次に。
(一般)
/opt/www/hogeramugera/batch/gumomo.php での処理ですが。
メールは「標準入力」に文字列としてだらりんこと入ってきます。
PHP的には、fopen('php://stdin', 'r') とか、もうちょっとざっくりいくなら file_get_contents("php://stdin") とかで、その文字列を取得します。
後は気合い入れてmail header部を解析します。
(MW)
ざっくりいくなら empty_mail_analysis クラスがお便利です。
以下のソースから大体なにかをイメージしてみてください。

require_once('empty_mail_analysis.inc');

$obj = new empty_mail_analysis;

$obj->set_token_separator('-');
//$obj->analysis();
$obj->analysis_from_stdin();

$from = $obj->get_mail_from();
$to = $obj->get_mail_to();
$tkn = $obj->get_mail_to_token();

print "from: $from \n";
print "to  : $to \n";
print "tkn : $tkn \n";

んと。
fromは「メールを送ってきた人のアドレス」。多分一番重要。
toは「どこ宛のメールか」。今回は「hogera」って解ってるから使わない。複数のアドレスを一気に処理したいなら使うかな。
tknは。えと…例えば。SMTPにもよるですが、hogera@foo.com の代わりに、例えば hogera-regist@foo.com(qmail)、hogera+regist@foo.com(postfix)、というアドレスが使えます。−なり+なり以降はお好きな文字列をどんぞ。
ちなみにこれを「拡張メールアドレス」と言って。
qmailは(多分)−で固定。
postfixは、デフォは+、main.cfの「recipient_delimiter」に設定をかますと − にもできます。
sendmailは…sendmail.cfを書き換えると可能(やったことあるし)なのですが…レシピ無くした orz。再構築する必要性をあんまり感じてないので、ここでは省略。


閑話休題


で。その拡張メールアドレスの+なり−なり以降の文字列が、tknに入るです。
ようは「mail headerの分析を少しやってくれる」クラスだとおもいねぇ。


んで。
その後は…まぁお好みで処理して下さい、なのですが。とりあえず「メールの送り主のアドレスはゲトれてるわけですし」。
(MW)
MWの場合、その後の処理も一応フォローしてます。
empty_mail_cushion というクラスがそれに当たるのですが。
何をやるかというと…


・empty_mail_analysisを使って、from, tknの情報をげとる。
・適当に、IDを作成する(tokenizer使用)
・上述のIDをpkにして、fromとtknをDBに格納する
・IDを暗号化する(デフォはrijndael256。っつかrijndaelしか今ロジック作ってない orz)。暗号化は、別途設定ファイルを用いる。
・同じく設定ファイルに書いてある内容を用いて、fromアドレスにメールを送る。
 返信するメールのテンプレートはconvフォーマットで。
 %%%token%%%に、暗号化されたIDを記述する。


ってな処理を行うです。
なので、後は、上述の「暗号化されたID」をプログラム側で受け取って。
・tokenの暗号を複合して
・IDを取り出して
・DBに問い合わせると
先ほどげとった、ユーザさんのメールアドレスがゲトれるわけです。


さて…どこでwikiにフォーマット変換しつつまとめよう orz