從 uw-imap 換到 courier-imap

應該很多人知道 uw-imap 因為漏洞太多又沒更新已經 bye bye 了,
FreeBSD 的 ports 裡先是把它設為 FORBIDDEN 之後直接砍了它,
對於這種幾乎不能 config 的 imap/pop3 client 我一直就很不爽,
偏偏大家又很愛裝它,
造成我前陣子也面臨了不得不將它換掉的狀況。

uw-imap 跟一般 IMAP server 不同,
它並不是真的使用 Maildir 而是使用 mailbox,
而且在後期它甚至還使用了 c-client 提供的 mbx 特殊格式,
這種格式跟傳統 mbox 的差異是檔頭多了一些東西,
然後每封信的 From: 這行也變成了它專屬的特殊格式,
所以就算去網路上抓了像是2md這類的轉檔工具來用也是不能轉的,
這類檔案必須使用 mailutil (有裝 uw-imap 的系統才會有) 轉成普通 mbox 的格式:

一旦轉成了傳統 UNIX 的 mbox 格式後,
2md 這類 script 就能快樂的 run 了。

Courier-IMAP 的設定其實也沒有什麼難度,
不過跟 LDAP 搭配的話建議以 pam 的形式支援多重認證模式 (系統帳號 + LDAP 帳號),
在安裝的時候如果有勾 LDAP 認證機制的話,
courier-authlib-base 和 courier-authlib-ldap 就會跟著被安裝進去,
這裡面包含了一個 courier-authdaemon,
它的設定檔在 /usr/local/etc/authlib 裡,
以 PAM 認證的話 authdaemonrc 裡要確認這幾行有寫對:

然後確定 /etc/pam.d 裡對應的設定有設好就行了;
如果想只走 LDAP 認證的話那就把 authpam 改成 authldap,
然後進 authldaprc 設定一下 (PAM 的話不用管這個檔案):

這個 authdaemon 是一個單獨的 daemon,
記得要把它 run 起來並在 /etc/rc.conf 設為 enable。

Courier-IMAP 這套同時支援 imap、imaps、pop3、pop3s 四種協定 (分成 4 個 daemon),
設定檔分別為 imapd、imapd-ssl、pop3d、pop3d-ssl,
設定方面基本上沒有什麼難度,
主要是注意這一行有寫好就行了:

SSL 版的設定大致上要注意的是這些 (以 imapd-ssl 為例,pop3 只是名字換一下而已):

然後檢查一下它們 TLS_CERTFILE 和 TLS_CACHEFILE 的路徑跟權限設定,
TLS_CERTFILE 是一個包含 key 跟 cert 的檔案,
如果原本是分開放的話用 text editor 把它們併在一個檔案再把路徑指過去就行了。

如果在 MTA 裡有指定 procmail 做為 MDA,
在 /usr/local/etc/procmailrc 放個兩行才能正確把信件導入 Maildir:

然後提醒 user 最好也在自己的 ~/.procmailrc 寫這兩行,
還有自動分類信件的地方要在原本的 mbox name 後面補一個 / 字元,
這樣 procmail 就會知道是要放進一個 maildir 而不是 mbox 了。

幫 user 轉換的時候可能要注意一下 Maildir 下會有一個叫 courierimapsubscribed 的檔案,
IMAP server 會看這個檔案決定要顯示哪些 sub-maildir 給 client,
檔案格式大概會像是這樣:

它們對應的實體目錄是 Maildir/.Drafts、Maildir/.Sent 以及 Maildir/.Trash,
總之就是在這個檔裡每個 sub-maildir 前面要冠個 INBOX. 就是了,
Courier-IMAP 是以 . 號當成路徑的 delimiter (設定一些 webmail 時要特別注意),
所以如果是 INBOX.AAA.BBB (實際路徑為 Maildir/.AAA.BBB) 在 client 上看起來 BBB 就是 AAA 的子目錄。

另外如果 user 沒有新信件可以轉的話,
那麼在他會沒有 ~/Maildir 這個目錄,
MTA 把信寄給這個 user 時會自動開一個,
不過在開出來之前要是 user 去存取 IMAP 服務的話會出現 error,
所以建議上是使用 maildirmake 這個指令幫他先造好一個。