空メールでユーザ登録

無料ケータイサイト等では空メールを送信することで利用登録するシステムがありますが、簡単に実装するとしたらこんな例があります。

1.空メールを送信。

2.メールサーバのalias若しくはforwardでスクリプトに転送。

3.スクリプトはメールのヘッダを解析し、登録完了メール返信及びDB登録を行う。

4.登録完了メールのURLからアクセスすると送られたIDの認証を行い案内する。

と、こんな感じです。

メールサーバをqmail、スクリプトをPHPとしてこんなサンプルを作ってみました。

1と4は同じPHPページml.phpを使用し、IDがない場合は空メール送信の案内。IDで認証できた場合はコンテンツを表示。
3は登録用スクリプトとしてmlreg.phpを使用。メールサーバからのみ起動される。

ml mlreg

mlreg.phpのサンプル中にあるFrom抽出は完全ではありませんが、メールの規格は実質無法地帯な状態できりがないのである程度対応できるレベルに留めておきます。

そしてqmailのaliasを使う場合
# cat /var/qmail/alias/.qmail-regist
| /usr/local/apache/htdocs/mlreg.php

このように転送先にスクリプトを設定します。
別に登録用PHPはウェブからアクセスする必要がないのでこの場所は不適切ですが…。

【2007/08/27 19:40追記】
上記プログラムはあくまで動作確認用でセキュリティに関しては一切考慮に入れておりません。
まさかそのまま使う人はいないだろうと思っているので注意事項も書かず放置しておりましたが、はてなブックマークからリンクされているのに気づき自分の愚かさと恥ずかしさで申し訳ない気持ちでいっぱいです。今後もセキュリティに関するサンプル以外はセキュリティ対策コードを含めることは少ないと思いますが、必ずどこが危険かは併記したいとおもいます。

因みに上記のプログラム内では、
ml.txt 6行目:
直接MySQLにGET引数を渡している事、これはセミコロンを挟んで閲覧者が任意のSQL文を実行できます(SQLインジェクション)。外部から取り込むパラメータには必ず内容のチェックを入れます。
ml.txt 9行目:
逆にDBから取り出したデータをそのまま表示するのも推奨できません。出力する書式に合わせて内容のチェックを行います。
ml.txt 12行目:
exsample・・・orz typoです。しかも実在するドメインですね。exsampleの方申し訳ありません。
ml.txt 16行目以降:
とりあえず表示されれば良いレベルで書いているので実際はちゃんとしたHTML書くなりしてください。
mlreg.txt 12~14行目:
ここはあまり参考にならないと思います。ヘッダー内にFromが2箇所あったりしても最初のFromを拾いますし、この部分については他所で良いライブラリが公開されています。
mlreg.txt 16~17行目:
コピペかすです… このコードはメールアラートに使っているものの流用です。その上変数名の変換忘れ
orz
mlreg.txt 22行目:
ここも$toまで用意して何故か$from[0]にしている…。どっちもどっちですが。
mlreg.txt 23~30行目:
これはauto_incrementで得たidをそのままアカウントに使用することに問題があります。つまり他の数字を使ってアクセスしたら他人の情報が表示されるという罠です。ここは連続性のないユニークIDを作成して発行するなりの工夫が必要です。(セッションハイジャックというのも厚かましいセキュリティホール)
mlreg.txt 35行目:
これも$titleではなく$subjectです。また元の文字コードを考慮していないので文字の組み合わせが悪いと誤認識するかも。実際にローカルで動作確認した時は日本語すら使ってなかったのでこのコードは跡付けです。
mlreg.txt 40行目:
ここもtypoです。

この度は大変お騒がせしました。直ぐに無意味なコードとtypoを修正したサンプルをアップします

【2007/09/23 02:20追記】
うわぁ…修正ファイルのアップを忘れてました…。一ヶ月近く経ってる。
とりあえず上記のとおりtypoと無意味なコードを省いたもので更新しています。セキュリティはまったく考慮していないので、使用するときは変数無害化とアクセス制限を追加してください。

メールサーバ上でのメール受信をトリガーとしてメールの内容を処理に使用するデータとして取り出すまでがエントリーの趣旨だったのでそれ以降の処理は端折っています。

phpMyAdmin で Parse error

PHP Parse error: syntax error, unexpected T_STRING, expecting ‘)’ in /usr/local/apache/htdocs/phpMyAdmin/lang/japanese-euc.inc.php on line 19

phpをインストールするときに–enable-zend-multibyteオプションをつけていると上記のようなエラーが発生する。今まで気が付かなかったが既存サーバに導入しても真っ白で表示されないから調べたらこんな始末でした。。。

参考:
PHP5.1.1
phpMyAdmin2.8.0.2
MySQL4.0.26

Apache2.2.4でwarning

多分Apache2.2以降だけだと思うが、ソースからインストールして起動する際に、

[warn] (2)No such file or directory: Failed to enable the ‘httpready’ Accept Filter

と出ることがある。
だからと言って動作に問題は出ないのだが気になるので調べたところ、適正に設定を行えばソケットの最適化をやってくれるらしい。

具体的には、通常サーバに対してリクエストを送信するとまずApacheとのソケット通信を開始してデータを送ります。これをOS側でクライアントからのリクエストが完了するのを待って初めてApacheへ接続しApacheのコネクション数の節約を行うようです。

FreeBSDの場合、デフォルトでこのような機能を組み込んだいないため、カーネルにロードしてあげます。

対象モジュール:
/boot/kernel/accf_http.ko

カーネルにロード
# kldload accf_http.ko

起動時に読み込むようにloader.confに追加
# echo ‘accf_http_load=”YES”‘ >> /boot/loader.conf