ようこそゲストさん

QdmailReceiver Multibyte mail decoder & POP Client

メッセージ欄

分類 【未分類】 で検索

一覧で表示する

出力文字コード

QdmailReceiverは、返り値のマルチバイトコードについては、mb_internal_encoding()に指定された文字コードに変換して返します。

したがって、適切にmb_internal_encoding()の文字コードの設定がなされていなければなりません。


特に、返り値の文字コードを別に指定したい場合は、charset()メソッドを使用してください。

carset() 返り値の文字コード指定 OOP型


$receiver->carset( 'EUC-JP' );

# test 『一番下「charset」メソッドのつづりが間違ってるお・・』 (2009/11/09 16:03)

# おんぎゃああああああああ 『$receiver->charset( 'UTF-8' ); でもいいですか? 』 (2011/02/03 22:58)

QdmailReceiverとは

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モードが使えない場合の代替手段

ダイレクトモード

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

# 開発は終わっていると思うのですが 『[attach_flag] => 1 何が、デコメで使ってる画像で、何が、添付ファイルなのか、区別がつきません。。。 Conte...』 (2011/02/06 14:31)

# ファイル名ある半角スペース 『ファイル名に半角スペースが入っていると、filename、filename_safeともに半角スペースで途切れてしまいます。修正...』 (2011/03/03 17:14)

# 自己解決 『あっているかちょっと自身はないのですが 627行目の if( $ret['attach_flag'] && (1===pr...』 (2011/03/10 10:16)

# 転送メールに添付ファイルがついていると本文を取得できない 『all()で取得できますが、 そのすべてのメールソースから本文のみを抽出するのは大変ですね。 どなたか簡単な取得法ありませんか?』 (2012/12/12 13:15)

# QdmailReceiverのPOP3受信エラー 『Qdmail便利に使わせて頂いております。 Qdmailを使用してSMTP送信する機能の実装が完了し、無事に動作しておりますが...』 (2013/04/20 20:13)

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

初期設定は必ず行ってください。

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サーバーからは削除されません)

# [質問]non-objectエラー 『基本的な質問で失礼します。 上記参考にPHPスクリプト作ってみましたが、以下エラーとなってしまいます。 Fatal error:...』 (2011/01/31 15:19)

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

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

メール件数の取得

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

次のメールを処理する

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

Directモード

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

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

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

使い方(OOPタイプ)

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