developer's diary

最近はc#のエントリが多いです

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を参照した際に存在すればスキップすればいいだけですね。超簡単だ。