2015-09-21 1 views
4

Я использую PHP imap_search в списке невидимых сообщений выборки, так как на определенную дату, как это:PHP imap_search невиданного с датой со временем

imap_search($stream, 'UNSEEN SINCE 20-Sep-2015'); 

Это работает отлично. Тем не менее, я периодически каждые несколько минут проверяю новые письма и сохраняю последнее время проверки в сеансе. Я хочу иметь возможность запускать imap_search с датой UNSEEN SINCE, включая время. Но это просто не работает. Я пробовал:

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

Ничто не работает. Любые идеи, если это можно сделать?

ответ

11

Глядя на определение 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 для поиска для сообщений, основанных на более конкретном времени, чем один день.


Другой способ сделать это, чтобы вспомнить UID из последнего сообщения, которое вы видели, а затем искать сообщения выше, что:

imap_search($stream, 'UID ' . $latest_uid . ':*', SE_UID); 

Опция SE_UID требуется сделать imap_search возврат UID вместо номеров последовательности сообщений.

+0

Просто быстрый вопрос @legoscia. Что произойдет, если сообщение $ last_uid будет удалено? Будет ли этот метод работать? – rAjA

+0

Он по-прежнему будет работать. Сервер IMAP пропустит недостающие UID и вернет существующие, вплоть до самого последнего сообщения в почтовом ящике. Обратите внимание, что '*' всегда представляет сообщение с наивысшим номером, поэтому, если '$ last_uid' удаляется и сообщения не добавляются, это будет возвращать новейшее все еще существующее сообщение. – legoscia

0

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