2015-09-21 91 views
4

我使用PHP imap_search因爲這樣一個給定的日期來獲取看不見的郵件列表:PHP imap_search UNSEEN SINCE日期與時間

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

這是工作的罰款。但是,我每隔幾分鐘會定期檢查新電子郵件,然後將最後一次檢查時間存儲在會話中。我希望能夠使用包括時間在內的UNSEEN SINCE日期運行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'); 

似乎沒什麼可行的。任何想法,如果這可以做到?

回答

11

RFC 3501SINCE定義展望:

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。如果$ latest_uid消息被刪除會發生什麼?這種方法仍然有效嗎? – rAjA

+0

它仍然有效。 IMAP服務器將跳過丟失的UID並返回現有的UID,直至包括郵箱中的最新消息。請注意,'*'總是表示編號最大的消息,所以如果刪除$ latest_uid並且不添加消息,這將返回最新的仍然存在的消息。 – legoscia

0

我不認爲這是可能的使用php和IMAP協議。看起來,IMAP在rfc 5032中定義了一個WITHIN搜索擴展,但它看起來像php還沒有這個標準呢。此外,SINCE標準(以及基本上IMAP協議中的所有日期時間標準)只是在執行搜索操作時忽略了時間和時區。 解決方法是使用當前查詢獲取電子郵件,然後獲取內部日期並使用php datetime函數實現過濾器函數。 希望這有助於。 有關IMAP的更多信息:rfc 3501