場景:
Zimbra 郵件服務器因變更了主域名,所有用戶的郵箱后綴也隨著變更到新域名。但是用戶郵箱聯(lián)系人中依然會保留了以前聯(lián)系過的人員的郵箱(老域名), 聯(lián)系人并不會隨著域名的改變自動更新。這就導致用戶發(fā)送郵件時,自動補全到了老域名郵箱(用戶很可能不會注意到這點)。
需求:
讓用戶自己去清理或者點擊忘記,對用戶來說是不太友好的方案。 這就要求郵件管理員能夠統(tǒng)一去給所有人做更新或者刪除。
思路嘗試:
思路1:將每個用戶郵箱中老域名的聯(lián)系人刪除。 通過老域名過濾聯(lián)系人,進行刪除操作。
- 首先,獲取某用戶的聯(lián)系人信息
[zimbra@com ~]$ zmmailbox -z -m shizhenning gact
Id: 673
Folder: /Emailed Contacts
Date: 05/28/21 15:16
Revision: 995
Attrs:
firstName: 王彥博
fullName: 王彥博
email: wangyanbo@p1.com
Id: 675
Folder: /Emailed Contacts
Date: 05/28/21 15:16
Revision: 996
Attrs:
firstName: 李志康
fullName: 李志康
email: lizhikang@p1.com
- 看看怎么刪除聯(lián)系人
[zimbra@com ~]$ zmmailbox help contact
autoComplete(ac) [opts] {query}
-v/--verbose verbose output
autoCompleteGal(acg) [opts] {query}
-v/--verbose verbose output
createContact(cct) [opts] [attr1 value1 [attr2 value2...]]
-T/--tags <arg> list of tag ids/names
-f/--folder <arg> folder-path-or-id
-i/--ignore ignore unknown contact attrs
deleteContact(dct) {contact-ids}
flagContact(fct) {contact-ids} [0|1*]
getAllContacts(gact) [opts] [attr1 [attr2...]]
-v/--verbose verbose output
-f/--folder <arg> folder-path-or-id
getContacts(gct) [opts] {contact-ids} [attr1 [attr2...]]
-v/--verbose verbose output
modifyContactAttrs(mcta) [opts] {contact-id} [attr1 value1 [attr2 value2...]]
-r/--replace replace contact (default is to merge)
-i/--ignore ignore unknown contact attrs
moveContact(mct) {contact-ids} {dest-folder-path}
tagContact(tct) {contact-ids} {tag-name} [0|1*]
有個 deleteContact 參數(shù),但是參數(shù)值需要明確指定聯(lián)系人的id,而不能根據(jù)域名直接操作。
另外還有個 modifyContactAttrs參數(shù),可以看到也需要明確指定id。既然都需要id,看來都不好實現(xiàn)。所以放棄刪除聯(lián)系人這個思路。
思路2. 把聯(lián)系人清空了,不就解決了嗎!
- 思路1中,已經(jīng)看到所有聯(lián)系人都在“/Emailed Contacts“ 這個文件夾下,看看能不能通過對文件夾的操作。
看看怎么操作文件夾
[zimbra@com ~]$ zmmailbox help folder
createFolder(cf) [opts] {folder-path}
-c/--color <arg> color
-u/--url <arg> url to connect to
-V/--view <arg> default type for folder (appointment,contact,conversation,document,message,task,wiki)
-F/--flags <arg> flags
createMountpoint(cm) [opts] {folder-path} {owner-id-or-name} {remote-item-id-or-path} [{reminder-enabled (0*|1)}]
-c/--color <arg> color
-V/--view <arg> default type for folder (appointment,contact,conversation,document,message,task,wiki)
-F/--flags <arg> flags
createSearchFolder(csf) [opts] {folder-path} {query}
-s/--sort <arg> sort order TODO
-c/--color <arg> color
-t/--types <arg> list of types to search for (message,conversation,contact,appointment,document,task,wiki)
deleteFolder(df) {folder-path}
emptyFolder(ef) {folder-path}
getAllFolders(gaf) [opts]
-v/--verbose verbose output
getFolder(gf) [opts] {folder-path}
-v/--verbose verbose output
有兩個文件夾操作命令, deleteFolder 、emptyFolder 分別是刪除和清空。 刪除的話就不建議了,可以試試清空。
- 清空聯(lián)系人
[zimbra@com ~]$ zmmailbox -z -m shizhenning ef "/Emailed Contacts"
[zimbra@com ~]$ zmmailbox -z -m shizhenning gact
[zimbra@com ~]$
確實清空了,web登陸后,也不會自動補全到老域名了,并且會自動補全到新域名。
將方案告訴相關同學后,相關同學反饋說,其實他們還是希望保留聯(lián)系人,最好是更新下,看看能不能直接把聯(lián)系人舊的域名替換成新域名。
聽到相關同學的反饋后,我自己深入思考了下,清空文件下雖然解決了問題,但其實不是合理的方案。 因為有的用戶會有外部聯(lián)系人,清空會把外部聯(lián)系人也清空,也許會導致丟失外部聯(lián)系人。 意識到這個方案有些魯莽了。
思路3. 更新聯(lián)系人。
剛才已經(jīng)看到有一個modifyContactAttrs 參數(shù),用來修改聯(lián)系人的相關參數(shù),但是只支持通過id字段來修改屬性。
命令說明:
modifyContactAttrs(mcta) [opts] {contact-id} [attr1 value1 [attr2 value2...]]
-r/--replace replace contact (default is to merge)
-i/--ignore ignore unknown contact attrs
聯(lián)系人屬性:
Id: 673
Folder: /Emailed Contacts
Date: 05/28/21 15:16
Revision: 995
Attrs:
firstName: 王彥博
fullName: 王彥博
email: wangyanbo@p1.com
在測試如何修改email字段時候,始終提示參數(shù)不夠,或者屬性錯誤。 就是不知道怎么使用這個命令,查閱資料,一點沒有該命令的使用案例,逼得咨詢zimbra技術支持,技術支持也說沒用過這個命令,需要研究研究。
接下來又是各種嘗試,想到即便測試成功了,還得先辦法搞定id的事,太復雜了。 一度想放棄,真想直接使用清空的方案。但些許的責任心讓我繼續(xù)測試。
功夫不負有心人,終于測試出來怎么使用了.
【我給已經(jīng)刪除的2位聯(lián)系人再次發(fā)了封郵件,聯(lián)系人里又保存了老域名,便于后續(xù)測試】
我的聯(lián)系人如下:
[zimbra@.com ~]$ zmmailbox -z -m shizhenning gact
Id: 807
Folder: /Emailed Contacts
Date: 05/28/21 19:33
Revision: 1229
Attrs:
firstName: 李志康
fullName: 李志康
email: lizhikang@p1.com
Id: 808
Folder: /Emailed Contacts
Date: 05/28/21 19:33
Revision: 1230
Attrs:
firstName: 王彥博
fullName: 王彥博
email: wangyanbo@p1.com
嘗試修改聯(lián)系人:
[zimbra@.com ~]$ zmmailbox -z -m shizhenning mcta 807 email lizhikang@tantanapp.com
807
[zimbra@.com ~]$ zmmailbox -z -m shizhenning gact
Id: 807
Folder: /Emailed Contacts
Date: 05/28/21 19:37
Revision: 1231
Attrs:
firstName: 李志康
fullName: 李志康
email: lizhikang@tantanapp.com
Id: 808
Folder: /Emailed Contacts
Date: 05/28/21 19:33
Revision: 1230
Attrs:
firstName: 王彥博
fullName: 王彥博
email: wangyanbo@p1.com
Folder、Date、Revision、Attrs 都不是屬性字段, firstName、fullName、email才是。
實現(xiàn)
- 實現(xiàn)了聯(lián)系人屬性修改,接下來就是實現(xiàn)id和email的對應關系了。 畢竟修改聯(lián)系人屬性 必須指定id.
寫個shell來實現(xiàn):
#!/bin/bash
for mailbox in `cat tantan_staff_email.txt` #全員郵箱賬號,不含@后綴
do
ids=`/opt/zimbra/bin/zmmailbox -z -m $mailbox gact| grep -i id | awk -F ":" '{print $2}'` #獲取聯(lián)系人所有id
for i in ${ids[@]}
do
/opt/zimbra/bin/zmmailbox -z -m $mailbox gct $i | grep "p1.com"
if [[ $? -eq 0 ]];then
contact=`/opt/zimbra/bin/zmmailbox -z -m $mailbox gct $i | grep "p1.com"|awk -F ":" '{print $2}'|awk -F "@" '{print $1}'` #獲取對應id下聯(lián)系人郵箱賬號前綴
/opt/zimbra/bin/zmmailbox -z -m $mailbox mcta $i email "$contact"@tantanapp.com
fi
done
echo "$mailbox process done!" >> /home/shizhenning/process.log
done
其中全員郵箱賬號通過如下命令獲取:
zmaccts | grep 'tantanapp.com' | grep 'active' | awk -F " " '{print $1}' | awk -F "@" '{print $1}' > /tmp/tantan_staff_email.txt
通過process.log 文件可以查詢處理日志。