前幾天,學校 E-Mail Server 軟體更新,其中包括 POP3,然而卻發生了一些小問題,像是會收到重複的信件以及有些郵件閱讀程式無法連線。
首先,如果有選擇在 server 端留備份的話,會發現重新收了一次收過的信件,然而當再收一次的時候卻又一切正常。要解釋這個問題,先來看看「在伺服器留郵件備份」這種功能是怎麼達成的。
在做 POP3 取信的時候,client(客戶端,也就是使用者所使用的郵件閱讀軟體)會用 RETR 取信,並且將該封信件的 unique-id(用 UIDL 取得)存下來,當下次收信的時候,就先比對在 server 上每一封信件的 unique-id 是不是曾經看過(就是已經收過),如果是的話,那個不用再收那封信,反之,沒看過的話,那就把信收下來,然後把 unique-id 存起來。
這聽起來很好,然而 RFC1939 裡面定義 UIDL 的時候,server 給的 unique-id 是特定的字串,並且是在 ASCII 0×21 到 0×7E 之間,然後不應該重複使用,換句話說,就是 implementation dependent。
因此,當換了 POP3 Server 後,因為給的 unique-id 長的不一樣,因此使用者就會重複收一次收過的信,有沒有辦法解決?沒有,除非每家 POP3 Server 給的 unique-id 照一定格式給,不然這沒辦法。
另外,除了還沒更新的兩台 POP3 Server 以外,其他台 POP3 welcome string 都變成這樣子:
根據 RFC1939 的規定,Server 只有兩種回應正面的 +OK 與負面的 -ERR,仔細看上面那行,給的是 +QPOP 這種鬼東西,於是照 RFC 寫的 POP3 client(像是 fetchmail)就很快樂的說 protocol error 就不抓信了。
經過一番調查,上面那個 welcome string 應該是自己改的,雖然 Outlook Express 似乎可以正常的收信,受影響的人似乎不太多,不過這樣子還是很糟糕,我已經寫信去跟他說了。
為了暫時解決這個問題,我只好改一下 fetchamil 的 source,讓他看到 +QPOP 也當作 +OK 來處理。
從後面這個問題看來,如果 Outlook Express 照 RFC 規定作的話,那大概會有一堆人跟計中抱怨了,雖然這樣子,我還是覺得照 RFC 來寫比較好。
0 Responses to “學校 E-Mail Server 軟體更新之後”
Leave a Reply