最近 CMLab 終於申請到 G Suite for Education 了~
也就是我們不用再維護自己的 mail server 了~灑花~

但這也就又多了一件事:Migration…
我們要做的事情有以下幾件:

  1. 讓 MX record 指到新的位置
  2. 遷移群組
  3. 遷移舊信

其中 2, 3 並非必須做的,但為了讓大家可以無痛轉移,我們才決定要搬信以及同步群組。
1, 2 十分容易,就照著說明就可以完成,真的不會的話還可以打給 Google 救援 XD
而本篇要紀錄的是 遷移舊信 的部分,這是其中最麻煩也最繁瑣的部分…

設定資料遷移工具

G Suite 中有提供資料遷移的工具,其中包含遷移舊信件,
他的方法是透過 IMAP 下載 dovecot 信件再匯入至 Gmail.

遷移設定中,要設定以下幾個東西:

  • 原郵件伺服器類型 → 我們的例子要選 其他電子郵件伺服器
  • 原本的 IMAP server
  • 管理者帳號 → 這好像沒甚麼重要的,只是他會收到遷移報告書

Password mismatch

這邊可能會遇到問題(帳號密碼不正確/password mismatch?),可以查看 /var/log/mail.log 中的詳細錯誤訊息:

1
2
Mar 16 19:00:54 cml2 dovecot: auth-worker(10594): pam(ssarcandy@cmlab.csie.ntu.edu.tw,173.194.90.100):
pam_authenticate() failed: Authentication failure (password mismatch?)

這是因為這邊使用 full email address 去登入 IMAP server,而原本我們 dovecot 的設定是只要打 user name 就好(不用加 @domain),才會造成帳密不正確的問題。

為了迎合 G suite 的格式,去原郵件伺服器更改 dovecot 設定:

1
2
3
4
$ vim /etc/dovecot/conf.d/10-auth.conf

# 找到 auth_username_format
# 反註解並改成 auth_username_format = %n

其中 auth_username_format 是指登入的 username 格式,預設是只有 @ 前面的部分。
由於 G suite 那邊就是要用 full address 登入,故這邊改成 %n ,亦即捨棄 @ 後面的東西,只留下 @ 前面的部分 。

改完之後記得重啟 dovecot

1
2
$ service dovecot restart
[ ok ] Restarting IMAP/POP3 mail server: dovecot.

設定遷移範圍

下一步是要設定要遷移的時間、資料夾等,
以我們的例子而言:

  • 時間選到 cmlab 創立以來的全部 ~(遷移!全都遷移!
  • 資料夾則選擇忽略幾個特定資料夾,像是 virus-mail , trash-mail, spam-mail 等等
完整的資料遷移設定 完整的資料遷移設定

選取遷移的使用者

接下來可以直接上傳一個 csv 檔,其中包含:

  • 原郵件伺服器帳號
  • 原郵件伺服器密碼
  • 對應的 gmail 帳號

上傳時有個潛規則,csv 檔不可以超過 500 行,超過它就會說未知錯誤(對,這是我們試出來的…

另外,在遷移時有幾個常見的錯誤:

驗證失敗

錯誤(18017):驗證失敗。
這表示所提供的原郵件伺服器帳號、密碼不正確,
也就是可能這個人不存在原郵件伺服器,或者提供的密碼不正確。

如果原郵件伺服器的驗證是像我們一樣透過 LDAP 的話,可以用 ldapsearch 確認這人在不在:

1
$ ldapsearch -x "uid=??,dc=base_dn"

連線至來源郵件伺服器時發生錯誤

錯誤(18002):連線至來源郵件伺服器時發生錯誤。
這錯誤是對應到 roundcube 的 連線到 imap 伺服器失敗 錯誤,有兩個可能:

  1. 因為那個人沒有家目錄
  2. uid mismatch → /var/spool/mail/username 的擁有者是錯誤的

會發生沒有家目錄的情況在我們的狀況而言就是那個人已被停權,那就根本不用遷移了。
而 uid mismatch 則是去 /var/spool/mail/username 更改成正確的擁有者就好了。

信箱錯誤。無法開啟資料夾或郵件

錯誤(18006):信箱錯誤。無法開啟資料夾或郵件。
這應該是屬於暫時性的錯誤,晚一點再重試看看。

Google 其實有提供一份錯誤一覽表 → 錯誤一覽表 (雖然有些有寫跟沒寫一樣…

怎麼得到大家的密碼

我想看到這邊應該會發現一個問題:
遷移的 csv 檔其中一欄要提供大家的密碼,這是即使是有 root 權限也沒辦法知道的資訊欸!
雖然我們最後還是有想到辦法,不過那過程也很繁瑣,就留到下一次介紹吧…