iT邦幫忙

0

imap的uid會異動,疑似有bug

  • 分享至 

  • xImage

小弟本來認為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??

有前輩知道發生什麼事了嗎?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
Ray
iT邦大神 1 級 ‧ 2022-09-30 16:36:16
最佳解答
舜~ iT邦高手 1 級 ‧ 2022-09-30 22:03:31 檢舉

但問題是我郵件沒有移動阿,理論上uid應該不變才對

Ray iT邦大神 1 級 ‧ 2022-10-02 10:54:38 檢舉

建議您先用 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 是不夠的, 你需要把:

  • UID
  • folder name
  • UIDValidity

這三個東西加在一起, 才能代表唯一的 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 說不定會有新發現...

我要發表回答

立即登入回答