【PHP】laravel-imapで指定uid以降のメッセージを取得する

こんにちは、フリーランスエンジニアの太田雅昭です。

LaravelでのIMAP

LaravelでのIMAPは、いろいろあるのだろうと思いますが、今回はwebklex/laravel-imap: ^6.2を使用しました。

指定uid以降のメッセージを取得

以下のようにすれば、指定uid以降のメッセージを取得できます。

use Webklex\IMAP\Facades\Client;
use Webklex\PHPIMAP\IMAP;

$host = env('IMAP_HOST');
$mailbox = 'INBOX';
$lastUid = 5;
$limit = 10;

$client = Client::make([
  'host'          => $host,
  'port'          => (int) env('IMAP_PORT', 993),
  'encryption'    => env('IMAP_ENCRYPTION', 'ssl'),
  'validate_cert' => filter_var(env('IMAP_VALIDATE_CERT', true), FILTER_VALIDATE_BOOLEAN),
  'username'      => env('IMAP_USERNAME'),
  'password'      => env('IMAP_PASSWORD'),
  'protocol'      => env('IMAP_PROTOCOL', 'imap'),
  'uid'           => true,
  'timeout'       => (int) env('IMAP_TIMEOUT', 30),
]);

$client->connect();
$folder = $client->getFolder($mailbox);

$messages = $folder
  ->messages()
  ->setSequence(IMAP::ST_UID) // シーケンスをuidに指定
  ->from('xxx@example.com') // FROMを指定。なくてもいい
  ->where("CUSTOM UID {$lastUid}:*")
  ->limit($limit) // limit
  ->get(IMAP:FT_PEAK) // 既読にしない

Gmailだと別の方法が必要

Gmailの場合は独特で、個別対応が必要なようです。