既読・未読の管理とUID機能の解説

2008/05/08 未分類 spok
一般的に使われているPOPプロトコルには、既読・未読の管理機能はありません。
一般的にメーラー*1は、そのソフトウエア*2で独自に既読・未読管理を行っています。

QdmailReceiverで既読・未読管理を行うには?

POPサーバーの多くは、UIDという機能を有しています。
これは、「受信サーバーが付けたメール番号」です。
その形式は様々です。
例)
プロバイダorレンタルサーバー名UIDの形式
so-net数字5桁
ドリームネット数字n桁.数字n桁.サーバーNumber?
ロリポップ数字n桁.数字n桁.サーバーNumber.lolipop.jp
さくらインターネットUID数字n桁-数字n桁

このUIDは、セッション(プロセス)が異なっても、その受信サーバー内では一意に保たれているのが通常です*3

UIDは、QdmailReceiverの場合、「popuid」という名称のヘッダー情報として格納します*4
これをデータベースなり、ファイル、セッション変数等に格納することで、既読・未読の管理をすることができるでしょう。

Pointer number は既読・未読管理に不向き

QdmailReceiver (及びPOPの仕様)では$receiver->pointer();*5)機能で、メールの番号付けを行います。
これは、メールを受信順に1から番号付けしてくれるものですが、しかし、これは当該セッション(プロセス)内だけで有効なものです。
メールの取得や削除には、Pointer Numberを使いますが、そのPOPプロセス内*6だけ、ということは意識しておいてください。
継続性範囲サポート
PointerNumberPOPプロセス内そのサーバー内だけどのPOPサーバーもOK
UID(popuid)削除するまでは
一意に保たれる
そのサーバー内だけたまにサポートしてない
サーバーもあるようだ*7

UIDとPointerNumberの変換

UID → PointerNumber(ポインタは移動しません。)
$receiver -> uidToPointer( uid );
または、
qd_receive_mail( 'uidToPointer' , uid );
 PointerNumber → UID (ポインタが移動するので注意してください。)
$receiver -> pointer( PointerNumber );
$receiver -> header( 'popuid' );
または、

qd_receive_mail( 'pointer' , PointerNumber );
qd_receive_mail( 'popuid' );
とすることで、UIDとPOINTERの変換ができます。

*1 : OutlookExpressをはじめBecky!や秀丸メール、その他ほとんどすべてのメーラー

*2 : クライアント

*3 : メッセージ本文が全く同じ場合は、同じUIDになってしまうサーバーもあることはあるようだ。POPのプロトコル上は、メッセージが同じであれば同じUIDを返すことになっているけれども、多くのサーバーはそれを拡張し、同じメッセージであっても異なるUIDを返す場合が多いと思う

*4 : UIDをサポートしないサーバーのため、格納しないように設定することもできる。

*5 : 又は、qd_receive_mail('pointer', ...

*6 : サーバーやPHPのプロセスではなく、POPのプロセス

*7 : お目にかかったことはないけれど。一応この機能はPOP3プロトコルのオプション扱い