Qmail 與 PHP 的 Mail() 函式
阿恆
Tobias Schlitt 最近發現他的 ez Mail 元件與 Qmail 有點不咬弦,送出的郵件標題多了額外的換行字符,以致部分郵件閱讀器出現錯誤的郵件標題,甚至無法接收郵件。
調查後發現 ez Mail 元件輸出的郵件標題與 PHP Mail() 都是使用 \r\n 作為換行字符,但是 Qmail 只肯接受以 \n 作為換行字符的標題,Qmail 會自動把 \n 轉換成 SMTP 規格指定的 \r\n,於是所有從 ez Mail 元件(與及 PHP Mail())送出的標題都被 Qmail 轉換成 \r\r\n,做成混亂和錯誤。
幸好 ez Mail 元件容許我們設定換行字符,Tobias 把它設定為 \n 便不再發生問題了。
這是 Qmail 的錯嗎?很難說,從 Qmail 的角度看,另一個程式(PHP)送給它的文本是應該使用 Unix 標準的換行字符(\n),\r\n 屬於網絡協定,不是程式與程式之間的協定。
從 PHP 的角度看,郵件是送給 sendmail 後再轉發出網絡的,Sendmail 容許標題的換行字符是 \n 或 \r\n,Qmail 既然替代了 sendmail,也應該繼承了 sendmail 得兼容能力,對標題中的 \r\n 作出適當處理。
無論如何這個問題暫時沒有完全的解決方案,PHP 指定使用 \r\n 作為換行字符已經在官方手冊中寫得很清楚,而且已經實行多年,無數系統都以此作為開發標準。Qmail 也承認這個問題,但無意改變。