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');

Кажется, ничего не работает. Есть идеи, можно ли это сделать?

Author: Ahmed, 2015-09-21

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 вместо последовательности сообщений числа.

 11
Author: legoscia, 2015-09-21 15:30:34

Я не думаю, что это возможно с использованием php и протокола IMAP. Похоже, что IMAP имеет расширение поиска ВНУТРИ, определенное в rfc 5032, но, похоже, у php пока нет этого критерия. Кроме того, критерии SINCE (и в основном все критерии даты и времени в протоколе IMAP) просто игнорируют время и часовой пояс при выполнении операции поиска. Обходным путем может быть получение электронных писем с вашим текущим запросом, а затем получение внутренней даты и реализация функции фильтра с помощью функции php даты и времени. Надеюсь, это поможет. Дополнительная информация об IMAP: rfc 3501

 0
Author: Pablo Flores, 2015-09-21 15:34:47