我已經不再負責維護 NTU WebMail System 了。
WebMail 目前是用數台前端(wmail6,wmail9)(處理 WWW 的部分),跟一台 !MySQL (wmail6)負責存使用者的設定、通訊錄等東西。www 的東西都放在 /usr/local/www 下,webmail 相關 maintainence 用的東西都在 /home/services/webmail。裡面主要釋放備份/upgrade/sync 用的 script。其中有一個是 sync.sh,是用來讓 wmail6 跟 wmail9 sync 東西用的(包含 /usr/local/www, /home/services/webmail, /usr/local/lib/php/pear)。
請先看過 notes,然後先在 www/data/horde.orig 跑 /home/services/webmail/cvs.sh,然後用 /home/services/webmail/upgarde.sh,這個會把 horde.orig → www/data/horde 然後跑 mergeconfig(改 mergemaster 的程式)。最後要 login horde as admin,去更新設定檔。另外就是用 patch.sh 去 apply 一堆有的沒的 patch(因為跟 CVS head,絕大部分會 fail,需要手動更新 patch 檔)。
這個問題很複雜,簡單的說,在用通訊錄的時候,有時候會因為中文的問題,讓 RCPT TO 變成空的,因此會收到 @localhost.cc.ntu.edu.tw 之類的退信。
問題有兩個部份,第一個是 contact.inc 裡面,OPTION 的 VALUE 是用 PHP 的 rawurlencode() 處理,而 decode 則是 JavaScript 的 unescape(),很不幸的是 unescape() 是認 Unicode 的(在 escape() 的時候會弄成 %uXXXX 這種,這可以看 mozilla/fierfox source: mozilla/ja/src/jsstr.c),而 rawurlencode() 則不認得,它是一個 byte 一個 byte 去弄的,所以說解回去之後會把中文弄爛,接下來在弄RCPT TO 的時候,會呼叫很多 Horde/framework/MIME* 跟 PEAR Mail 的東西,裡面很多檢查會產生 error,於是 RCPT TO 就爛了。這個修正也很困難(至少我找不到)。
目前的解法是這樣子的,要就 encode/decode 都是 PHP(or JavaScript)來處理,但是以目前架構下不太可能,要改寫的代價太大,因此,我決定違反 W3C 的規範,在 VALUE 的地方,用 ' 把 value 弄起來,然後不呼叫 rawurlencode(),而是在 addAddress 的時候用 escape()。
另一個部份則是 \ 在 PEAR Mail::RFC822 檢查的時候,會被列成不合法的東西,因此也會把 RCPT TO 弄爛。而因為去改寫這部份會牽扯到太多 Horde 整個架構,於是就乾脆不檢查 \(Big5 會有的問題)。
另外一點是目前在用的寫信那個 compose.php 在 send 的時候如果底下有 PEAR Error 並不會傳回來,導致大家以為信是 ok 的,目前是硬 display PEAR Error,而最新的 CVS Version 中,已經改成有 error 會叫了。
$nls['defaults']['language'] = 'zh_TW'; $nls['charsets']['zh_TW'] = 'UTF-8'; $nls['emails']['zh_TW'] = 'BIG5';
$conf['sql']['charset'] = 'utf-8';