POP3を利用してメール受信する際に重複を防ぐ仕組み。「UIDL」を利用する
メールの受信処理でメール受信をトリガーにコマンド実行できない場合は、cronでx分単位で定時バッチを実行するのが一般的だと思います。
その際に受信したデータをメールサーバに残したままだと、何度も処理済みのデータを受信する羽目になってしまいます。
今回はそれをどうやって防ぐかという内容。
結論
「uidl」を利用します。
参考:重複せずに POP サーバからメールを受信する仕組み UIDL
PHPでUIDLを確認
ライブラリは「Net/POP3.php」を利用してます。
<?php require_once 'Net/POP3.php'; $pop = new Net_POP3(); $pop->connect(HOST, PORT); $pop->login(USER, PASS); $messages = $pop->getListing(); foreach($messages as $message){ var_dump($message); }
結果
array(3) { ["msg_id"]=> string(1) "1" ["size"]=> string(5) "74529" ["uidl"]=> string(35) "494902.IMUdeXl3re8levBIsfglvt47mt4w=" } array(3) { ["msg_id"]=> string(1) "2" ["size"]=> string(5) "34529" ["uidl"]=> string(35) "494932.IMUdeXl3re8erev4Is2vter7mt4w=" }
getListingで取得した結果を単純に回してvar_dumpしているだけですが、["uidl"]が確認できました。
あとはこれを処理後にDBに保存して、次回DBを参照した際に存在すればスキップすればいいだけですね。超簡単だ。