2025年1月10日 星期五

把所有帳號的信件都接收到自己的伺服器上 (三): 從 zimbra 匯出 csv 格式的通訊錄; 匯入 neomutt 與 posteo

延續 mbsync + neomutt + msmtp 這一篇, 接下來我想把 zimbra (使用多年下來系統自動建立) 的 「姓名 email」 通訊錄搬到 neomutt 跟 posteo。 先講心得: 過程當中用 csv 檔比較方便處理; 處理 vcf 檔的工具太少了。 反正最後要轉 vcf 很簡單。

在 zimbra 裡面匯出通訊錄 首先在 zimbra 裡面進入 「喜好設定」 => 「匯入匯出」, 在 「匯出」 底下的 「聯絡人」 選取 「Thunderbird 聯絡人」, 「來源」 選取 「已寄送電子郵件的聯絡人」。 匯出存檔叫做 zimbra.csv 好了。 這個檔案很寬, 但其實只有前五欄有值, 分別是 First Name, Last Name, Display Name, Nickname, Primary Email。 先這樣處理: sed 's/"//g' zimbra.csv | perl -F, -nale 'printf("%s,$F[4]\n", ($F[2] || "$F[1]$F[0]"));' | sort | uniq > contacts.csv 得到一個兩欄的 csv 檔, 第一欄來自 Display Name 或是 Last Name 跟 First Name 的組合; 第二欄則是 email。 重複的列已刪除。 實際上我在 > 存檔之前還加了: | grep -Pv '^(s\d+),\1@' 以便刪掉長得類似這樣: 「s123456789,s123456789@cyut.edu.tw」 沒有姓名只有學號的列。 當初如果是採用 vcf 檔, 連基本轉檔的工具都很難找, 更不要說做上述的處理。 另外, 以下用不到標題列了, 先手動刪掉吧。

想要在 neomutt 裡面啟用 email completion 功能 (收件人快打), 大家都推薦 abook 。 安裝好之後建立 ~/.abook/ 並且匯入剛才的通訊錄: rm -f ~/.abook/addressbook ; abook --convert --informat csv --infile contacts.csv --outformat abook --outfile ~/.abook/addressbook 即可這樣測試: abook --mutt-query '明' 會列出所有姓名當中包含 「明」 這個字的聯絡人以及他們的 email。 命令上單獨打 abook 可以進入互動模式。 大推這篇 abook tutorial; 不過目前我還沒有認真用。

在 neomutt 的設定檔 例如 ~/.mutt/muttrc) 裡面加入這一句: set query_command = "abook --mutt-query %s" 於是按 m 鍵要寫新的 mail 時, 可以在 neomutt 提示 To: 的時候打 「明」 (或是打 email 的幾個字母) 然後按 ctrl-T, neomutt 就會列出上述的聯絡人清單讓你選。

在 posteo 裡面匯入通訊錄 Posteo 帳號的話, 只接受 vcf 格式的通訊錄匯入。 (vcf 範例) 最簡單的方式還是自己寫程式: csv2vcf.py 然後這樣轉檔: csv2vcf.py 'FN: EMAIL:' contacts.csv > posteo.vcf 意思是 「第零欄是全名、第一欄是 email」。 然後就可以從 「My account」 的 「User admin」 找到 「Import address book」 功能, 匯入剛剛產生的 posteo.vcf 。

寄信終於不用再 「另開一個文字視窗、 複製貼上 email」 了, 耶! 是說我這個退休 i 人好像也很少有機會需要主動寄 email 啊 ...

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。