小弟本來認為uid是永恆不變,除非該信件更換資料夾,
msgno則是該資料夾的郵件順序,隨時在變,
message_id 該信件不論是否更換資料夾皆永恆不變,但有重複的可能,
因為不會移動資料夾,所以小弟在儲存的時候會使用uid做id使用,
但今日發現隨著刪掉垃圾信後,uid竟然就變了...感覺我uid其實是msgno??
我環境是PHP 8.1.6 / win11專業版x64
上測試code
主要是控制imap_search回傳uid或msgno,接著轉換成msgno或uid
$search = 'FROM "xxxxxxx" SUBJECT "xxxxxxxx"';
$list1 = imap_search($mail->imap_stream, $search, SE_UID);
echo 'UID:' . implode(', ', $list1) . PHP_EOL;
echo 'uid->msgno: ' . imap_msgno($mail->imap_stream, current($list1)) . PHP_EOL;
echo PHP_EOL;
$list2 = imap_search($mail->imap_stream, $search, SE_FREE);
echo 'msgno:' . implode(', ', $list2) . PHP_EOL;
echo 'msgno->uid: ' . imap_uid($mail->imap_stream, current($list2)) . PHP_EOL;
echo PHP_EOL;
回應結果如下
UID:2789
uid->msgno: 2789
msgno:2789
msgno->uid: 2789
uid, msgno 竟然一模一樣...
但刪除垃圾信前uid是2790,
所以uid其實就是msgno的別名??
還是uid有bug??
有前輩知道發生什麼事了嗎?
但問題是我郵件沒有移動阿,理論上uid應該不變才對
建議您先用 Telnet/Netcat tcp 143 (IMAP Port), 用手動人工下指令去查 UID 試試看, 指令如下:
https://www.rfc-editor.org/rfc/rfc9051#name-uid-command
如果人工手動查, 發現 UID 不會變, 但是 PHP 的 imap_uid 抓到卻會變的話, 那就是 PHP Library 有 Bug, 應該要向 PHP 作者查證...
如果用人工手動查就會變的話, 那代表這台 IMAP Server 可能沒有依照 RFC 9051/2.3.1.1. Unique Identifier (UID) Message Attribute 的規範去製作, 你應該去向 IMAP Server 的作者查證:
https://www.rfc-editor.org/rfc/rfc9051#name-message-numbers
最後, 在 IMAP 裡面要準確標示一個 Message, 光用 UID 是不夠的, 你需要把:
這三個東西加在一起, 才能代表唯一的 Message ID:
RFC 9051/2.3.1.1:
... Any change of unique identifiers between sessions MUST be detectable using the UIDVALIDITY mechanism discussed below. Persistent unique identifiers are required for a client to resynchronize its state from a previous session with the server (e.g., disconnected or offline access clients [IMAP-MODEL]); this is discussed further in [IMAP-DISC]....
你去查一下 UIDValidity 說不定會有新發現...