要正確取得 imap_mail_move/imap_mail_copy 的資料夾名稱,不要猜測,請使用 imap_list。
(PHP 4, PHP 5, PHP 7, PHP 8)
imap_mail_move — 將指定的郵件移至信箱
將 message_nums
指定的郵件移至指定的 mailbox
。請注意,郵件實際上是*複製*到 mailbox
,原始郵件則會標記為刪除。這表示 mailbox
中的郵件會被分配新的 UID。
imap
一個 IMAP\Connection 實例。
message_nums
message_nums
參數不僅僅是訊息編號(如 » RFC2060 中所述)而是一個範圍。
mailbox
信箱名稱,詳情請參閱 imap_open()。
除非停用 imap.enable_insecure_rsh,否則將不受信任的資料傳遞給此參數是*不安全的*。
flags
flags
是一個位元遮罩,可以包含單個選項
CP_UID
- 序列號包含 UID
版本 | 說明 |
---|---|
8.1.0 | imap 參數現在需要一個 IMAP\Connection 實例;以前需要一個有效的 imap 資源。 |
注意:
imap_mail_move() 會將原始郵件標記為刪除標記,要成功刪除它,必須呼叫 imap_expunge() 函式。
使用 imap_mail_move、imap_mail_copy 或 imap_delete 後,必須呼叫 imap_expunge() 函式。
imap_mail_move() 函式的第二個參數(message_nums 參數)接受兩個有效值
個別訊息編號
47
或
陣列
47,58,112
請記住以下四個關鍵事項!
1. 這個移動函式實際上並沒有移動任何東西,它在內部建立一個副本,然後刪除原始郵件!
2. 您應該在內部追蹤 Message-Id 標頭(應該設定!)以確認唯一的 IMAP ID。
3. 因為當訊息被偽「移動」時,原始訊息和唯一的 IMAP ID 就會遺失!這表示在內部副本(或者對我們來說,已經被移動)建立之後,您必須建立與第二個信箱資料夾的新連線,列出或搜尋並透過內部訊息識別碼進行驗證,以保持您的郵件程式與外部伺服器同步。這反過來又意味著...
4. 您必須在第一個信箱資料夾中的已複製訊息被刪除後追蹤它。這為您提供了兩種邏輯方法可以使用
4.1 個別移動訊息,然後取得目的地資料夾的索引(例如,從收件匣移到垃圾桶),使用這個指令「移動」訊息,取得垃圾桶郵件資料夾的索引,並比較陣列以找出不同的郵件。
4.2 但實際上我們一次會移動多封郵件,所以你可以針對每個訊息掃描郵件資料夾,然而這假設標頭(例如 Message-Id)存在。
搜尋範例
$result = imap_search($mail_connection_folder_trash, "TEXT \"<24322757.12578452.2416351620568@domain.tld>\"", SE_UID);
以我處理數千封電子郵件的有限經驗來看,只有垃圾郵件發送者或薪資低得離譜的開發人員才不會設定 Message-Id。然而,你不能假設缺少標頭就代表是垃圾郵件,因為我原本的系統就從未設定它。因此,在非常見的情況下,使用次要或第三種方式搜尋不同的郵件可能是有必要的。這種情況可能會在數千封郵件中出現一次。
希望這個邏輯可以為一些人省下構思的時間。