PHP imap поиск НЕВИДИМЫЙ С даты и времени
Я использую PHP imap_search для получения списка невидимых сообщений с определенной даты, например:
imap_search($stream, 'UNSEEN SINCE 20-Sep-2015');
Это работает нормально. Тем не менее, я периодически каждые несколько минут проверяю наличие новых электронных писем, а затем сохраняю время последней проверки в сеансе. Я хочу иметь возможность запускать imap_search с НЕВИДИМОЙ датой, включая время. Но, похоже, это просто не работает. Я пробовал:
imap_search($stream, 'UNSEEN SINCE 20-Sep-2015 12:35:03 +0000 (UTC)');
imap_search($stream, 'UNSEEN SINCE 20-Sep-2015 12:35:03 +0000');
imap_search($stream, 'UNSEEN SINCE 20-Sep-2015 12:35:03');
Кажется, ничего не работает. Есть идеи, можно ли это сделать?
2 answers
Рассматривая определение SINCE
в RFC 3501:
SINCE <date>
Messages whose internal date (disregarding time and timezone)
is within or later than the specified date.
И date
определяется как просто дата, без времени:
date = date-text / DQUOTE date-text DQUOTE
date-day = 1*2DIGIT
; Day of month
date-month = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" /
"Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"
date-text = date-day "-" date-month "-" date-year
date-year = 4DIGIT
Таким образом, вы не можете использовать SINCE
для поиска сообщений на основе времени, более определенного, чем день.
Другой способ сделать это - запомнить идентификатор последнего сообщения, которое вы видели, а затем выполнить поиск сообщений выше этого:
imap_search($stream, 'UID ' . $latest_uid . ':*', SE_UID);
Опция SE_UID
требуется, чтобы imap_search
возвращал идентификаторы UID вместо последовательности сообщений числа.
Я не думаю, что это возможно с использованием php и протокола IMAP. Похоже, что IMAP имеет расширение поиска ВНУТРИ, определенное в rfc 5032, но, похоже, у php пока нет этого критерия. Кроме того, критерии SINCE (и в основном все критерии даты и времени в протоколе IMAP) просто игнорируют время и часовой пояс при выполнении операции поиска. Обходным путем может быть получение электронных писем с вашим текущим запросом, а затем получение внутренней даты и реализация функции фильтра с помощью функции php даты и времени. Надеюсь, это поможет. Дополнительная информация об IMAP: rfc 3501