STDINモード

2008/05/17 未分類 spok

STDINモードとは

メールの受信サーバーから、パイプライン処理等で、PHPプログラムを直接起動し、標準入力(STDIN)経由でメールデータを受け渡しするモードです。
受信サーバーの種類によって設定が異なります。

使い方(一般関数タイプ)

標準入力から、メールの全文を入手するタイプですので、他のプログラムの標準出力をパイプにて受け渡しする必要があります。
また、受け取った側のPHPプログラムは、多くの場合、1行目に、動作元となるPHP本体プログラムを指定する必要があるでしょう。
指定は、ファイルの最初に #! と綴り、そのすぐ後からPHP本体へのパスを記述します。
下記の例は、さくらインターネットの場合です。-qは、quietモードであり、httpヘッダーを出力しない設定です。
#!/usr/local/php-5.2.6/bin/php-cgi -q
<?php

include_once('qdmail_receiver.php');

qd_receive_mail( 'stdin' );

?>
サーバーによって
#!/usr/local/php-5.2.6/bin/php-cgi -q
の部分は変更する必要があるでしょう。

よくわからない場合は、
#!/usr/bin/php
で、うまくいくことが多いとは思います*1
qd_receive_mail( 'stdin' );
と宣言すれば、後は他のモードの使い方と同じです。

使い方(OOPタイプ)

qd_receive_mail( 'stdin' );
の代わりに
QdmailReceiver::start( 'stdin' );
として下さい。

文字コードについて

QdmailReceiverは、すべての出力を、内部エンコーディングに変換して返します。
特定の文字コードにしたい場合は、以下のようにしてください。
utf-8で出力する場合の例)
qd_receive_mail( 'stdin' , 'utf-8' );
または
QdmailReceiver::start( 'stdin' , 'utf-8' );

*1 : 保証の限りでない

応用

Qdmailはメール受信サーバーを操作することができますが、次のようなことはどうでしょうか。
メールが到着したら、リアルタイムで処理する
メール到着をきっかけに、何らかのプログラムを走らせるわけですね。
これはPOPサーバーに定期的にアクセスするプログラムでは実現できません。
せいぜい、cron*2で、数分おきに実行させるのがやっとでしょう。

しかし、sendmail,qmail,PostFixなどのメールサーバーとQdmailReceiverを組み合わせることで実現することができます。
これが実現できれば、以下のようなサービスが簡単に提供できるでしょう。
  • 空メールによる簡単会員登録
  • ブログへのメール投稿
  • メール転送プログラム
  • 簡易メーリングリスト
  • リアルタイムSpamフィルター
  • WEBメール

*2 : unix系の定期実行デーモン