2021年5月7日 星期五

[經驗分享] Zimbra 常用 CLI 指令整理 (持續更新)

 


Zimbra 是開源界中最好用的郵件協作平台之一,在管理上也提供了許多實用指令方便管理者以 script 進行自動化操作,本文整理我較常使用的指令,提供分享。




前置作業

由於 Zimbra 所有的服務與程式都會以 zimbra 這個帳戶身份執行,因此在使用本文所有指令之前,請先切換帳戶身份後再開始執行
su zimbra
指令

或者,想要單次執行指令不想先做切換,又或是要放到 script 裡,可以使用另一種方式:
/bin/su - zimbra -c "指令"







指令列表

以下將分類整理不同對象的指令,其中的 user 請替換為您的帳戶,domain 請替換為您的網域名稱。

zmcontrol

# 查看所有服務狀態
zmcontrol status


# 重啟所有服務
zmcontrol restart


# 停止所有服務
zmcontrol stop


# 啟動所有服務
zmcontrol start


# 重啟 MTA 服務
zmmtactl restart


# 重啟 LOG 服務
zmloggerctl restart


# 重啟防毒與反垃圾郵件服務
zmamavisdctl restart


# 重啟代理伺服器服務
zmproxyctl restart


# 重啟統計資料服務
zmstatctl restart

zmlocalconfig

# 查看本機伺服器所有設定
zmlocalconfig


# 查看本機伺服器單項設定
zmlocalconfig <設定>


# 查看本機伺服器相關密碼
zmlocalconfig -s | grep ldap_amavis_password 
zmlocalconfig -s | grep ldap_nginx_password 
zmlocalconfig -s | grep ldap_postfix_password 
zmlocalconfig -s | grep ldap_replication_password 
zmlocalconfig -s | grep ldap_root_password 
zmlocalconfig -s | grep zimbra_ldap_password


# 查看本機伺服器是否顯示來源 IP Header
zmlocalconfig zimbra_http_originating_ip_header


# 修改本機伺服器設定
zmlocalconfig -e <設定>=<數值>


# 修改本機伺服器顯示來源 IP Header
zmlocalconfig -e zimbra_http_originating_ip_header="X-Forwarded-For"


# 查看 Zimbra-ldap 是否啟用 StartTLS
zmlocalconfig | grep ldap | grep tls


# 關閉 Zimbra-ldap 使用 StartTLS
zmlocalconfig -e ldap_starttls_required=false
zmlocalconfig -e ldap_starttls_supported=0


# 允許未信任的 SSL 憑證
zmlocalconfig -e ssl_allow_untrusted_certs=true


# 設定高品質檔案預覽器
zmlocalconfig -e oo_linux_install_path=/usr/bin/soffice
zmcontrol restart


# 設定預設檔案預覽
zmlocalconfig -e oo_linux_install_path=/HIGHFIDELITYOFF
zmcontrol restart

zmprov

# 查看信任 IP
zmprov gcf zimbraMailTrustedIP

# 修改信任 IP (若一次要設定多個,在後方串接)
zmprov mcf +zimbraMailTrustedIP 127.0.0.1 +zimbraMailTrustedIP 192.168.1.200


# 查看中繼網域轉發設定
zmprov gd <域名> zimbraMailCatchAllAddress
zmprov gd <域名> zimbraMailCatchAllForwardingAddress
zmprov gd <域名> zimbraMailTransport


# 修改中繼網域轉發設定 (可以使用 smtp 或 lmtp)
zmprov md <域名> zimbraMailCatchAllAddress @<域名>
zmprov md <域名> zimbraMailCatchAllForwardingAddress @<域名>
zmprov md <域名> zimbraMailTransport lmtp:<目標LMTPServer:Port>


# 檢視所有網域
zmprov gad


# 修改網域名稱
zmprov -l rd <原有域名> <新的域名>


# 停用舊版 SSL/TLS 與加密協定
zmprov mcf -zimbraReverseProxySSLProtocols TLSv1 
zmprov mcf -zimbraReverseProxySSLProtocols TLSv1.1
zmprov mcf -zimbraReverseProxySSLProtocols TLSv1.2
zmprov modifyConfig zimbraReverseProxySSLCiphers '!AES128-SHA256:!AES128-SHA:!CAMELLIA256-SHA:!CAMELLIA128-SHA!AES256-SHA:!AES256-SHA256:!AES256-GCM-SHA384:!AES128-GCM-SHA256:!ADH:!eNULL:!aNULL:!DHE-RSA-AES256-SHA:!SSLv2:!MD5:!EXPORT:!DES:!PSK:!RC4:HIGH'


# 外部驗證帳戶密碼失敗時嘗試本機驗證
zmprov md domain zimbraAuthFallbackToLocal TRUE


# 取消外部 LDAP 繫結帳戶設定
zmprov md domain zimbraAuthLdapSearchBindDn "" 
zmprov md domain zimbraAuthLdapSearchBindPassword ""


# 查看與修改 Webclient http 服務連接埠號
zmprov gs `zmhostname` | grep zimbraMailPort
zmprov ms `zmhostname` zimbraMailPort '8081'


# 查看與啟用 Web Admin Coneols https 服務連接埠
zmprov gs `zmhostname` | grep zimbraReverseProxyAdminEnabled
zmprov ms `zmhostname` zimbraReverseProxyAdminEnabled TRUE


# 查看與修改 Web Admin Coneols https 服務連接埠號
zmprov gs `zmhostname` | grep zimbraAdminProxy
zmprov ms `zmhostname` zimbraAdminProxyPort '59091'


# 變更對 LMTP 儲存時不經由 DNS 查詢而直接指向本機
zmprov ms mtaserver.com zimbraMtaLmtpHostLookup native
zmprov mcf zimbraMtaLmtpHostLookup native


# 清除 Zimlet 快取
zmprov flushCache zimlet


# 清除佈景主題快取
zmprov flushCache skin


# 清除語言檔快取
zmprov flushCache locale


# 啟用 CBPolicyd 服務
zmprov ms `zmhostname` +zimbraServiceInstalled cbpolicyd 
zmprov ms `zmhostname` +zimbraServiceEnabled cbpolicyd


# 查看 SMTP 寄信主機連接埠號
zmprov gs `zmhostname` | grep zimbraSmtpPort


# 變更 SMTP 寄信主機連接埠號
zmprov ms `zmhostname` zimbraSmtpPort 26


# 查看外部轉信主機設定
zmprov gcf zimbraMTARelayHost
zmprov gcf zimbraMTAFallbackRelayHost


# 修改外部轉信主機設定
zmprov mcf zimbraMtaRelayHost <轉信主機位址>:<轉信主機連接埠>
zmprov mcf zimbraMtaFallbackRelayHost <轉信主機位址>:<轉信主機連接埠>


# 查看已啟用與已安裝服務
zmprov -l gs `zmhostname` | egrep -i 'serviceen|servicein'


# 停用服務 (完成後記得重啟 Zimbra)
zmprov -l ms `zmhostname` -zimbraServiceEnabled <服務名稱> 


# 查看 MTA 信任網路
zmprov gs `zmhostname` zimbraMtaMyNetworks


# 設定 MTA 信任網路 (後面為範例,請不要照抄)
zmprov ms `zmhostname` zimbraMtaMyNetworks '127.0.0.0/8 192.168.1.0/24 172.18.0.1 172.17.0.1 192.168.1.100'


# 啟用 HTTP DoSFilter (單位 ms)
zmprov mcf zimbraHttpDosFilterDelayMillis 20


# 設定 HTTP DoSFilter 每秒最大請求數
zmprov mcf zimbraHttpDosFilterMaxRequestsPerSec 30


# 設定 HTTP DoSFilter 信任清單
zmprov mcf zimbraHttpThrottleSafeIPs 10.1.2.3/32 zimbraHttpThrottleSafeIPs 192.168.4.0/24


# 新增 HTTP DoSFilter 信任清單上的主機
zmprov mcf +zimbraHttpThrottleSafeIPs 10.1.2.3/32


# 設定登錄失敗封鎖機制 (25 分鐘內 5 次登錄嘗試失敗後阻擋 IP,兩小時後解鎖 IP)
zmprov mcf zimbraInvalidLoginFilterDelayInMinBetwnReqBeforeReinstating 25
zmprov mcf zimbraInvalidLoginFilterMaxFailedLogin 5
zmprov mcf zimbraInvalidLoginFilterReinstateIpTaskIntervalInMin 120


# 設定變更密碼連結頁面
zmprov mcf zimbraChangePasswordURL "https://mailserver.domain/h/changepass?skin=harmony"


# 檢視公開服務通訊協定與連接埠
zmprov gcf zimbraPublicServiceHostname
zmprov gcf zimbraPublicServicePort
zmprov gcf zimbraPublicServiceProtocol


# 設定公開服務通訊協定與連接埠
zmprov mcf zimbraPublicServiceHostname <zimbraserver.domain>
zmprov mcf zimbraPublicServiceProtocol https
zmprov mcf zimbraPublicServicePort 443
zmcontrol restart


# 設定 Open Drive 介接 Nextcloud/ownCloud 
zmprov md <domain> zimbraDriveOwnCloudURL '<Nextcloud/ownCloud 首頁>'
zmcontrol restart

zmprov dl

# 查看所有通訊群組清單
zmprov gadl


# 建立動態通訊群組清單,同時設定 ldap 查詢字串
zmprov cddl <通訊群組清單名稱>@domain memberURL '<ldap>'
zmprov cddl engineers@domain memberURL 'ldap:///??sub?(&(objectClass=zimbraAccount)(ZimbraAccountStatus=active))'


# 建立動態通訊群組清單,同時設定 displayName 顯示名稱
zmprov cddl <通訊群組清單名稱>@domain displayName '<顯示名稱>'


# 通訊群組清單更名
zmprov rdl <通訊群組清單名稱>@domain <新通訊群組清單名稱>@domain
zmprov rdl engineers@domain engineers2@domain


# 查看通訊群組清單屬性
zmprov gdl <通訊群組清單名稱>@domain
zmprov gdl engineers@domain


# 設定通訊群組清單在全域通訊錄 (GAL) 隱藏
zmprov mdl <通訊群組清單名稱>@domain zimbraHideInGal TRUE


# 查看通訊群組清單成員
zmprov gdlm <通訊群組清單名稱>@domain
zmprov gdlm engineers@domain


# 查看通訊群組清單
zmprov gdl <通訊群組清單名稱>@domain
zmprov gdl engineers@domain


# 刪除通訊群組清單
zmprov ddl <通訊群組清單名稱>@domain
zmprov ddl engineers@domain


# 增加通訊群組清單成員
zmprov adlm <通訊群組清單名稱>@domain <加入的成員>@domain
zmprov adlm engineers@domain user1@domain


# 移除通訊群組清單成員
zmprov rdlm <通訊群組清單名稱>@domain <移除的成員>@domain
zmprov rdlm engineers@domain user1@domain


# 匯出通訊群組清單
zmprov gdlm <通訊群組清單名稱>@domain > dirstlist.txt 
zmprov gdlm edmlist1@domain > dirstlist.txt 

# 匯入通訊群組清單
for i in `cat dirstlist.txt | egrep -v '#|members'`;do zmprov adlm <通訊群組清單名稱>@domain.com $i;done 
for i in `cat dirstlist.txt | egrep -v '#|members'`;do zmprov adlm edmlist1@domain.com $i;done 


zmprov account

# 查看帳戶屬性
zmprov ga user@domain
zmprov ga user@domain <屬性名稱>
zmprov ga user@domain description
zmprov ga user@domain title
zmprov ga user@domain zimbraMailTransport


# 修改帳戶屬性
zmprov ma user@domain <屬性名稱> '<修改數值>'
zmprov ma user@domain description '帳戶描述'
zmprov ma user@domain title '資深工程師'


# 指定外部 LDAP 驗證目標帳戶
zmprov ma user@domain zimbraAuthLdapExternalDn "uid=ldapuser,dc=domain,dc=com" 


# 移除外部 LDAP 驗證目標帳戶
zmprov ma user@domain zimbraAuthLdapExternalDn ""


# 查看帳戶狀態
zmprov ga user@domain zimbraAccountStatus 


# 解除帳戶鎖定 (啟用)
zmprov ma user@domain zimbraAccountStatus active


# 帳戶鎖定
zmprov ma user@domain zimbraAccountStatus lock


# 帳戶停用 (關閉)
zmprov ma user@domain zimbraAccountStatus closed


# 帳戶更名
zmprov ra user@domain user2@domain


# 增加帳戶別名
zmprov aaa user@domain useralias@domain


# 建立帳戶
zmprov ca user@domain password


# 變更帳戶密碼
zmprov sp user@domain newpassword


# 刪除帳戶
zmprov da user@domain


# 列出指定網域的帳戶
zmprov -l gaa domain


# 列出啟用中的帳戶 (sa 功能非常耗用記憶體,請審慎使用)
zmprov -l sa '(zimbraAccountStatus=active)'


# 列出啟用中的帳戶並排除系統帳戶 (sa 功能非常耗用記憶體,請審慎使用)
zmprov -l sa '(&(objectClass=zimbraAccount)(ZimbraAccountStatus=active)(!(Name=*galsync*))(!(Name=*ham.*))(!(Name=*spam.*))(!(Name=*virus-quarantine.*))(!(Name=admin)))'


# 列出所有系統管理員帳戶
zmprov gaaa


# 建立額外的系統管理員帳戶
zmprov ca admin2@domain password zimbraIsAdminAccount TRUE


# 設定偏好寄件使用位址 (例如別名)
zmprov ma user@domain zimbraPrefFromAddress <郵件位址>


# 列出帳戶別名
zmprov ga user@domain | grep zimbraMailAlias


# 列出所有別名 (不包含系統帳戶) (sa 功能非常耗用記憶體,請審慎使用)
zmprov sa -v '(objectClass=zimbraAccount)' | grep zimbraMailAlias | grep -v -E "galsync|quarantine|spam|root|postmaster"


# 匯出帳戶篩選條件設定 (三個步驟)
zmprov ga user@domain zimbraMailSieveScript > /tmp/user@domain.rules.txt
sed -i -e "1d" user@domain.rules.txt 
sed -i -e 's/zimbraMailSieveScript: //g' user@domain.rules.txt

# 匯入帳戶篩選條件設定
zmprov ma user@domain zimbraMailSieveScript "`cat user@domain.rules.txt`"


# 匯出帳戶 HTML 簽名 (三個步驟)
zmprov ga user@domain zimbraPrefMailSignatureHTML > /tmp/user@domain.signaturehtml.txt
sed -i -e "1d" /tmp/user@domain.signaturehtml.txt
sed 's/zimbraPrefMailSignatureHTML: //g' /tmp/sig/$NAME > /tmp/user@domain.signaturehtml.txt


# 匯入帳戶 HTML 簽名
zmprov ma user@domain zimbraPrefMailSignatureHTML "`cat user@domain.signaturehtml.txt`"


# 重建帳戶郵件索引,開始與狀態查閱
zmprov rim user@domain start
zmprov rim user@domain status

zmprov cos

# 查看服務類別 (COS) 設定
zmprov gc <cos名稱>
zmprov gc highleveluser


# 擷取服務類別 (COS) ID 欄位
zmprov gc <cos名稱> | grep zimbraId:
zmprov gc highleveluser | grep zimbraId:


# 擷取服務類別 (COS) ID 欄位內容
zmprov gc <cos名稱> | grep zimbraId: | cut -d ' ' -f 2
zmprov gc highleveluser | grep zimbraId: | cut -d ' ' -f 2


# 檢視是否允許以高品質及原始格式預覽附件檔
zmprov gc <cos名稱> | grep zimbraFeatureViewInHtmlEnabled


# 檢視附件檔索引設定
zmprov gc <cos名稱> | grep zimbraAttachmentsIndexingEnabled


# 檢視外部資料來源設定 (type 欄位 cal/pop3/imap)
zmprov gds user@domain


# 建立外部資料來源,以 Gmail IMAP 為例 (建議密碼讓使用者至 WebUI 自行輸入,不要在 CLI 填入)
zmprov cds user@domain imap "User - Gmail" zimbraDataSourceEmailAddress user@domain zimbraDataSourceEnabled TRUE zimbraDataSourceHost imap.gmail.com zimbraDataSourceUsername user zimbraDataSourcePassword password zimbraPrefFromAddress user@gmail zimbraPrefFromDisplay 'User Name' zimbraDataSourceConnectionType ssl  zimbraDataSourcePort 993

zmmailbox

# 搜尋郵件
zmmailbox -z -m <帳戶> search -t message -l 100 "<搜尋字串>"
zmmailbox -z -m user@domain search -t message -l 100 "in:inbox subject: 要搜尋的主旨"


# 顯示郵箱已使用容量
zmmailbox -z -m user@domain gms


# 匯出連絡人至 CSV (可用格式有 zimbra-csv / yahoo-csv / thunderbird-csv / outlook-2000-csv / outlook-2003-csv)
zmmailbox -z -m user@domain -t 0 getRestURL "//contacts?fmt=outlook-2003-csv"
zmmailbox -z -m user@domain -t 0 getRestURL "//其它通訊錄名稱?fmt=outlook-2003-csv"


# 讀取篩選器設定
zmmailbox -z -m user@domain getFilterRules


# 新增篩選器設定
zmmailbox -z -m user@domain addFilterRule '規則名稱:主旨郵件轉發' active any header 'subject' matches '符合的主旨' redirect 'manager@domain'


# 修改篩選器設定
zmmailbox -z -m user@domain modifyFilterRule '規則名稱:主旨郵件轉發' active any header 'subject' matches '符合的主旨' redirect 'manager@domain'


# 刪除篩選器設定
zmmailbox -z -m user@domain deleteFilterRule '規則名稱:主旨郵件轉發'


# 將郵件檔案 (.eml / .msg) 匯入指定帳戶收件夾
zmmailbox -t 0 -z -m user@domain addMessage /inbox 1.eml
zmmailbox -t 0 -z -m user@domain addMessage /測試信件夾 /tmp/user/*.eml


# 將郵箱匯出為 tgz 壓縮檔
zmmailbox -z -m "user@domain" getRestURL "//?fmt=tgz" > /backup/user@domain.tar.gz


# 從 tgz 壓縮檔匯入至郵箱 
zmmailbox -z -t 0 -m "user@domain" postRestURL "//?fmt=tgz&resolve=reset" /backup/user@domain.tar.gz


# 從 tgz 壓縮檔匯入至郵箱,使用 curl 避免 client.IO_ERROR (Read timed out) 
curl -k -H "Transfer-Encoding: chunked" -u admin:password -T "user@domain.tar.gz" -X POST "https://127.0.0.1:7071/service/home/user@domain/?fmt=tgz&resolve=skip"


# 顯示指定帳戶資料夾狀況,如資料夾名稱、資料夾類型、數量、未讀、路徑...等等
zmmailbox -z -m "user@domain" gaf


# 顯示指定帳戶資料夾名稱,只列出郵件功能的資料夾
zmmailbox -z -m "user@domain" gaf | awk  '$2 ~/mess/ {print $5}'


# 顯示指定帳戶資料夾 ID,只列出郵件功能的資料夾且指定名稱者,本例為收件、寄件、草稿匣
zmmailbox -z -m "user@domain" gaf | awk  '$2 ~/mess/ {print $1, $5} ' | awk '/Sent|Inbox|Drafts/ {print $1} '


# 顯示指定帳戶資料夾 ID,排除垃圾郵件、聊天等功能的資料夾
zmmailbox -z -m "user@domain" gaf | awk  '$2 ~/mess/ {print $1, $5} ' | awk '!/Chats|Junk/ {print $1} '


# 於指定帳戶下建立資料夾,本例為建立名為「測試」之郵件資料夾
# 選項 -V 可用參數 conversation / message / contact / appointment
zmmailbox -z -m "user@domain" cf -V message "/測試"

zmzimletctl

# 部署 Zimlet
zmzimletctl deploy <zimlet檔名>
zmzimletctl deploy <zimlet_uc.zip>

others

# 查看郵件佇列
postqueue -p
mailq


# 查看郵件佇列 (依網域)
qshape hold 


# 重送佇列中的郵件
postqueue -f


# 刪除佇列中的郵件
postsuper -d ALL


# 立即同步 GAL 全域通訊錄
zmgsautil forceSync -a galsync@domain -n InternalGAL


# 郵件狀況查詢
zmmsgtrace -s '<寄件者郵箱>'
zmmsgtrace -s 'user@domain'
zmmsgtrace -r '<收件者郵箱>'
zmmsgtrace -r 'user@gmail.com'


# 列出所有帳戶狀況總覽
zmaccts


# 匯出 LDAP 伺服器所有資料
ldapsearch -h <Server IP> -x -D "uid=zimbra,cn=admins,cn=zimbra" -w <ldap_root_password> > /tmp/ldap_export.ldif
ldapsearch -h 192.168.20.100 -x -D "uid=zimbra,cn=admins,cn=zimbra" -w hjf3jgc > /tmp/ldap_export.ldif


# 匯入 LDAP 伺服器所有資料
ldapadd -h <Server IP> -x -c -D "uid=zimbra,cn=admins,cn=zimbra" -w <ldap_root_password> < /tmp/ldap_expore.ldif
ldapadd -h 192.168.20.100 -x -c -D "uid=zimbra,cn=admins,cn=zimbra" -w hjf3jgc < /tmp/ldap_export.ldif


# 列出所有 Postfix 設定內容
postconf


# 設定所有郵件備份
postconf -e always_bcc=archivebox@domain


# 查看所有郵件備份設定
postconf always_bcc


# 修正權限問題
zmcontrol stop
sudo /opt/zimbra/libexec/zmfixperms
zmcontrol start


# 伺服器更名 (在要變更名稱的伺服器上執行)
/opt/zimbra/libexec/zmsetservername -n '<新伺服器名稱>'
/opt/zimbra/libexec/zmsetservername -n 'mailserver.domain'


# 檢視所有憑證資訊
zmcertmgr viewdeployedcrt all 








參考資料