[案例分享]電郵搬家


除了虛擬主機日常維運,替新客戶搬遷資料也佔我們不少工作量的比例。很多人以為搬家只是工程師按一下就能完全工作,實際上每次搬遷都有機會遇到意想不到的狀況。

這一次分享的個案,客人在舊廠商的虛擬主機空間已經用滿,所以不能透過cPanel導出備份,關於這個部份我們有經驗處理,就是部份資料先用FTP導出,也不困難,我們一天內就幫客戶移轉好。

但問題來了,第二天客人回報郵箱子資料夾內的郵件都打不開。應該是因為郵箱資料直接經FTP導出,缺了格式轉換(UTF8轉UTF7)的過程,導致中文名稱的資料夾都打不開。那天我們立即寫了一個小程序進行轉換,解決客人的問題。

因為時差關係,廠商沒有立刻回覆,所以當天真的是我們自己用python寫了一個轉換出來。如果有其他朋友遇到一模一樣的問題,可以參考以下的轉換方式 (這個是後來廠商提供,不是我們自己寫的)。

flat_maildir_utf8_to_mutf7() {
local maildir=$1 olddir newdir oldsub newsub
find "${maildir}" -mindepth 1 -maxdepth 1 -type d -printf '%P\n' | while IFS= read -r olddir; do
# stderr is ignored to silence:
# Error: net_connect_unix(/var/run/dovecot/stats-writer) failed: Permission denied
if ! newdir=$(doveadm mailbox mutf7 -8 "${olddir}" 2> /dev/null); then
continue
fi
if [ -z "${olddir}" ] || [ -z "${newdir}" ] || [ "${olddir}" = "${newdir}" ]; then
continue
fi
mv "${maildir}/${olddir}" "${maildir}/${newdir}"
if [ -f "${maildir}/subscriptions" ]; then
# Convert dir separator from . to \t
oldsub=${olddir//./$'\t'}
newsub=${newdir//./$'\t'}
# Strip leading separator and escape for regex
oldsub=$(sed 's/[.[*^\/&$]/\&/g' <<< "${oldsub:1}")
newsub=$(sed 's/[.[*^\/&$]/\&/g' <<< "${newsub:1}")
# Update subscriptions file
sed -i "s/^${oldsub}$/${newsub}/" "${maildir}/subscriptions"
fi
done
}

發佈留言