QdmailReceiverとは

2008/05/18 未分類 spok
hal456トップページ

QdmailReceiverでできること

  • メールデコード(日本語OK)
  • 受信サーバー(POP)操作
PHPで、日本語での空メールや多機能転送メールを簡単に実現したり、POPメールボックス操作でWEBメールを実現できたりします。主にメールのMIMEデコード機能、POP操作機能から成り立っています。その他、様々な用途が考えられるでしょう。
Pear::Mail,Pear:MIMEなどで同様の機能は実現できますが、メールの仕組みを理解していないと難しいです。Qdmailシリーズは、「初心者には簡単に、上級者には詳細に」のポリシーのもと、簡単使用方法と、詳細使用方法の両方を使うことができます。
簡単にメールのデコードができるので、例えば、取得したメールをヘッダーと本文まるごとデータベースに保存しても、すぐに内容を取り出すことができます。
gmailのようなWEBサービスも比較的簡単に実現できるでしょう。

更新情報

QdmailReceiverの特徴

  • 統合部分
    • 簡単関数タイプを用意
    • ファイル一つで、STDIN , POP , 直接デコードの3つの機能を統合して使用可能
  • デコード部分
    • 日本語メールのデコード
  • POP機能部分
    • メールの取得、削除
    • ヘッダーのみ取得する高速モードあり
    • 特定ヘッダーのみの抜き出し機能
    • UID取得機能

3つのモード

スタンダードインプットモード(STDIN)

メールの受信サーバーから、パイプライン処理等で、PHPプログラムを直接起動し、STDIN経由でメールデータを受け渡しするモードです。
受信サーバーの種類によって設定が異なります。
以下のような用途に使えるでしょう。
  • 空メール
  • spam排除サービス
  • 転送メール
  • WEBメールサービス
  • メールによる各種メンバーサービス

POPモード

メールの受信サーバーにPOPプロトコルで接続し、溜まっているメールを取得します。
以下のような用途に使えるでしょう。
  • WEBメールサービス
  • spam排除サービス
  • STDINモードが使えない場合の代替手段

ダイレクトモード

メールデータ(ヘッダーも含めた全部)を渡すことで、ヘッダー部分を分割し、解析します。日本語も大丈夫です。
以下のような用途に使えるでしょう。
  • 複雑なメール転送
  • 他のソフトと組み合わせて、メールのデコード

POP特有の処理(OOPタイプ)

2008/05/17 未分類 spok
初期設定は必ず行ってください。

OOPでいける方はそれなりにPHPに習熟した方と思いますので、例題の解説として進めます。
$receiver には、初期化されたQdmailReceiverオブジェクトが代入されているものとします。
ご自分の(安全な)受信サーバー(POPサーバー)を初期設定し以下を実行してみてください。
当然ですが、POPサーバーにメールが残っていなければなりません。テストする場合はあまりたくさんのメールが残っていると時間がかかりますので、数通にしておきましょう。
echo  "<pre>";
for($i = 1 ; $i <= $receiver->count() ; $i++){

    echo "Mail number: ".$receiver->pointer()."\r\n";
    echo htmlspecialchars(
        print_r(
           $receiver->header( array('subject','name') , 'none' )
        ,true)
    ,ENT_NOQUOTES);

    echo "\r\n";
    $receiver->next();
}

echo "</pre>";
メール件名一覧が表示されましたか?
順番に解説していきます。
$receiver->count()
で、POPサーバーに残っているメールの件数を取得します。
未読・既読の管理はPOPの機能ではできません(そもそもPOPプロトコルは未読・既読を行いません)
$receiver->pointer()
現在、どの順番のメールを読んでいるかを取得します。
この順番(pointer)はセッション毎(プロセス毎)に変わります。これをプロセスを超えて共有して使用すると意図しない結果となる場合がありますので、注意してください。
プロセスを超えて、メールを特定したい場合は、POP-UID機能を使ってください。
$receiver->header( array('subject','name') , 'none' )
いよいよ本題です。これで、件名を取得しています。
一般的には
$receiver->header( 取得するヘッダー名 , 存在しない場合の返り値(省略可) )
と書きます。
どのような配列で内部格納されているか知りたい方は、上記のコードを以下に修正して、表示させてみてください。
     $receiver->header( 'subject' , 'none' )
これで、subjectに関するデコードデータを配列の形で入手することができます。

同様にして、
     $receiver->header( 'from' , 'none' )
     $receiver->header( array('from',0,'name') , 'none' )
なども試してみましょう。
注意!
ヘッダー名は、すべて小文字で指定してください。
ループの最後はカレントポインタの移動です。
 $receiver->next();
これで、次のメールへと処理をうつします。現在のメール情報は消去されます。(QdmaiReceiverの内部的に消去されるだけであって、POPサーバーからは削除されません)

POP特有の処理(一般関数タイプ)

2008/05/17 未分類 spok
POP初期化の処理を前提とします。初期化(サーバー情報の設定)を行わないと、POPでメールを受信サーバーから取得することはできません。
今後、受信サーバーのことをPOPサーバーと記載します(この場合は同じものを示しています)。

メール件数の取得

echo qd_receive_mail( 'count' );
これで、POPサーバーに溜まっているメールの件数を取得します。

次のメールを処理する

何も指定しなければ、受信サーバーに溜まった最初のメールだけを処理します。
それ以降のメールの処理をするには、次のようにします。
qd_receive_mail( 'next' );

Directモード

2008/05/17 未分類 spok
Directモードは、引数にメール全文を与えることで、そのメールを解析するモードです。
一番ベーシックな働きをします。
POPモードやSTDINモードも、このDirectモードを呼び出して使っています。

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

qd_receive_mail( 'direct' , 'メールデータ全文' );
メールデータ全文は、本文だけなく、ヘッダーも含めた全文である必要があります。
SMTPに準拠した形式を受け付けます。

使い方(OOPタイプ)

QdmailReceiver::start( 'direct' , 'メールデータ全文' );
あとは共通の使い方と同じです。