ようこそゲストさん

QdmailReceiver Multibyte mail decoder & POP Client

メッセージ欄

2008年5月の日記

STDINモード

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系の定期実行デーモン

# SAMURAI 『この度はお世話になります。 STDINモードで メールの本文がとりだせないのですが・・ お助け頂けますと幸いです。 #!/us...』 (2008/11/08 6:01)

# spok 『 どんなエラーですか?』 (2008/11/09 20:03)

# SAM 『 お世話になります。 以下のようなかたちで、sendmailのaliasとして仕込んでいます。 (※function_sendM...』 (2008/11/09 20:35)

# spok 『 stdin関係のスクリプトは原因が特定しにくいのですが、まずは以下のサイトを参考に、パーミッションを再確認してみてください。そ...』 (2008/11/09 22:21)

# SAMURAI 『ご返信ありがとうございました。 パーミッションを確認しましたが、問題なさそうでした。 再度 //$body = $recei...』 (2008/11/09 24:59)

# spok 『>"554 5.3.0 unknown mailer error 255" >が戻って来ます。 というのは、どう「戻って」来ま...』 (2008/11/10 6:25)

# spok 『なぜこれをお伺いするかというと、本来 >"554 5.3.0 unknown mailer error 255" はSMTPサー...』 (2008/11/10 7:50)

# spok 『$all = $receiver->all(); とすると、$allには、ヘッダーも含めたメール全文が代入されます。 この$a...』 (2008/11/10 8:00)

# SAMU 『 お世話になります。 すみません、何度もお手数をおかけ致します。 $body = $receiver->all(); とし、...』 (2008/11/10 13:46)

# spok 『 ようやくなさっていることがわかりました。 おそらく、本文解析の部分でPHPがエラーを出しているため、このバウンスメールが返っ...』 (2008/11/10 24:13)

# SAMU 『 お世話になります、 何度もすみませんでした。 頂きましたサイトを参考に cat でエラーを はき出させたところ、下記がでまし...』 (2008/11/10 26:49)

# spok 『ご連絡ありがとうございました。 今後の更新時には、このエラー回避を組み込みたいと思います。』 (2008/11/11 7:54)

# SAMU 『こちらこそありがとうございました。 またVerUPの際には差し替えて活用させて頂きたいとおもいますので、 どうぞよろしくお願い致...』 (2008/11/11 14:07)

# SAMU 『前回はお世話になりました。SAMUと申します。 QdmailReceiverを利用させて頂き、gmailからのメールの処理をP...』 (2009/02/06 25:20)

# SAMU 『お世話になります。自己レスです。 ※前回の確認用スクリプトは一部記述が間違っておりました。 (正) $attach_files...』 (2009/02/08 20:58)

# Vert 『こう書きましたが、本文はうまく取得できるのですが、タイトル部分がうまく取得できません。環境はcakePHP1.2、console...』 (2009/03/27 13:28)

# wataru 『STDINモードで、添付画像が抽出できないものがあったので・・・ バージョンは、0.1.4aです GMailの場合、bound...』 (2010/12/15 17:43)

# wataru 『あっ、既に報告がありました<(_ _)>』 (2010/12/15 17:45)

ダウンロード

version

アルファー版ですが、それなりに使えるかと思っています。
ご意見、ご不満、動作報告などしていたけると励みになります。

ファイルの置き場所

includeできる場所であれば、どこでも構いません。
ファイル1つ構成ですので、バージョンアップも上書きするだけです。

最新版

2008-09-15 0.1.4.alpha.zip

更新履歴
以前のバージョン
2008-09-14 0.1.3.alpha.zip
2008-09-11 0.1.2.alpha.zip
2008-06-01 0.1.1.alpha.zip
2008-05-17 0.1.0.alpha.zip

ライセンス(License)

このPHPプログラム Qdmail はオープンソースであり、The MIT Licenseでライセンスされています。
The MIT License http://www.opensource.org/licenses/mit-license.php
改変、再配布、商用利用は自由に行えます。ライセンスに基づく限り、無料であり、貴方はどこにもお金を支払う必要はありません*1
詳しくは、上記URLをご覧下さい。
(以前はもっと制約の多いAGPLv3でしたが、より緩いMIT Liceseに変更しました。)

このライセンスに守るのが難しい方は、作者に連絡をとってください。
連絡先は、このサイトのサイドバーにメールアドレスに記載してあります。私は多くのスパムメールを受け取っているので、必ず、E-mailの"subject"には"Qdmail"の言葉を入れて下さい。

作者は、操作に関する質問はメールでは受け付けていません。質問のある方はこのサイトの適当な記事にコメントをつけることで行って下さい。ただし、作者の都合により、その質問には回答が寄せられないことがあります。

*1 : くれるというならいただきます

  • 2008-09-11 QdmailReceiver Multibyte mail decoder & POP Client spok
    ダウンロードはこちら QdmailReceiver 0.1.2aメール本文がカラの時に、添付ファイルが重複してデコードされるバグを修正
  • 2008-09-14 QdmailReceiver Multibyte mail decoder & POP Client spok
    ダウンロードはこちら QdmailReceiver 0.1.3aヘッダー取得前にメール本文を取得しようとすると、うまくいかないバグ修正。version()メソッド追加
  • 2008-09-15 QdmailReceiver Multibyte mail decoder & POP Client spok
    ダウンロードはこちら QdmailReceiver 0.1.4amultipart/aliternative 等のつなぎパートが添付ファイルとして認識されてしまうバグを修正。添付ファイルを返す配列のcontent-idヘッダ情報の配列キーが、content...

更新履歴

2008-06-01 0.1.aalfa ライセンスをMITライセンスに変更。
2008-05-17 0.1.0alfa 公開

記事リスト

メール番号とUID番号

POPプロトコルでは、メールを特定するのに、2つの番号があります。
名称特徴QdmailReceiverでの別名
メール番号POPセッション毎に1から付け直しpointer番号
UID番号POPサーバー内では一意に保たれる(セッション超えてOK)popuid
UID番号の方が一意に保たれるので、たいへん便利なのです。しかし、POPでは、受信サーバーに溜まっているメールを特定するのには、メール番号を使うことになっています。

したがって、UIDとメール番号の変換を行うには、以下のコマンドを使用してください。

サンプルコード

受信サーバーに溜まっている件名をすべて表示する。
 $server = array(
    'protocol'=>'pop3',
    'host'=>'pop.example.com',
    'user'=>'userID',
    'pass'=>'password',
 );

qd_receive_mail( 'start' , $server ); 
$max = qd_receive_mail( 'count' );
echo "<pre>";
for($i = 1 ; $i <= $max ; $i++){
    echo 'Mail Number: '.qd_receive_mail( 'pointer' ).' subject: ';
    echo qd_receive_mail( 'header' , array('subject','name') );
    echo "\r\n";
    qd_receive_mail( 'next' );
}
echo "</pre>";
die();
本文を取得するつもりがないのであれば、ヘッダのみ取得するようにするには次の文を'start'の次に挿入します。これで本文を受信サーバーから取得しないので若干高速になります。
qd_receive_mail( 'popHigh' , 0 ); 

タイトルに「未承諾広告」があるメールをサーバーから削除する

qd_receive_mail( 'start' , $server ); 
qd_receive_mail( 'popHigh' , 0 ); 
$max = qd_receive_mail( 'count' );
$target = array();
for($i = 1 ; $i <= $max ; $i++){
    $subject = qd_receive_mail( 'header' , array('subject','name') );
    if( false !== mb_strpos( $subject , '未承諾広告' ) ){
        $target[] = qd_receive_mail( 'pointer' );
    }
    qd_receive_mail( 'next' );
}
foreach( $target as $del_id ){
    qd_receive_mail( 'delete' , $del_id );
}
    qd_receive_mail( 'done' );
この例では、いったん$target変数に、該当のメール番号を溜めて、後でまとめて削除しています。
このようにしなくても、最初のif文の部分で、deleteしても大丈夫ですが、必ず最後にdoneコマンドを実行することを忘れないようにしてください。