2015年9月13日 星期日

備份/清空 gmail, 以及命令列查詢/切割 mbox 格式檔案

從 google takeout 下載 gmail 每年暑假我會把一整年份的 e-mail 從雲端拉到自己的硬碟備份、 把雲端信箱清空。 這兩年開始, 我都用 gmail; 你用的若是 zimbra 或是其他的 webmail, 這篇可能也有部分適用。

備份之前要有一些準備。 我平常用 gmail 有個固定的模式: 從不 「封存」; 凡是想長久保存的 e-mail (包含自己寫得很得意的寄件備份) 都手動指定一兩個標籤。 所以現在要備份時, 凡是系統自動產生的標籤 (例如自己好幾個不同的 e-mail 別名) 都可以略過不備份。

標籤最好都用英文或每個標籤至少內含一小段英文, 因為 google 匯出時, 會拿標籤當作檔名, 但在 linux 底下, 它的中文檔名會變亂碼。

在 「設定」 => 「一般設定」 分頁把 「頁面大小上限」 設成 100, 等一下比較方便批次選取大量郵件。

等一下如果需要把某標籤 xyz 內的 所有郵件 (或大部分郵件) 刪掉或移動, 但 xyz 內有幾千封信件, 那麼可以先選取一整頁的 (100 封) 郵件, 然後點選 「已選取這個頁面上全部 100 封郵件」 後方的 「選取「"xyz"」中全部 幾千 封郵件」, 即可一次處理這幾千封信件。

「垃圾桶」 需要特別處理。 它也是一個標籤, 但別以為不選它就沒事了。 因為一封信若有好幾個標籤, 它不一定會出現在哪一個檔案內 (有待研究...)。 所以最好把 「垃圾桶」 裡面最近幾天的信件搬到某個標籤 (例如 garbage) 底下、 把垃圾桶清空, 然後才開始備份。 沒做這一步時, 我的備份檔約有 1.6G; 做了這一步, 備份檔的大小只剩下 0.1G!

  1. google 「我的帳戶」。 登入後, 從最下方 「管理您的內容」, 進入 建立封存檔案
  2. 要備份哪些東西? 先勾 「全部不選」 再單獨勾選 「郵件」。 點一下小小的下箭頭, 出現子選單。 不要 「包含您的所有郵件」 而要改選 「選取標籤」。
  3. 選取要備份的標籤 進入標籤選單之後, 按 「全選」, 然後把不需要備份的標籤取消掉。 (例如 garbage、 ckhung@c.edu.tw 等等)
  4. 「下一步」、 「建立封存檔」 之後, 耐心等待幾小時。
  5. 收到 e-mail 通知、 下載解壓縮後, 會看到許多 (以標籤為檔名的) *.mbox 檔。
  6. find . -type f -ls | sort -n -k 7 看一下哪幾個檔特別大。
  7. 安裝 mutt 套件、 mutt -f some_tag.mbox 檢視一下特別大的檔, 看看是否有些內含大型附加檔的信件可以刪掉。 也確認備份出來的檔案真的可以用。
  8. 如果需要把 some_tag.mbox 拆成每封信一個小檔, 可以這樣做: perl -pe 'open STDOUT, sprintf(">m%05d.mbox", ++$n) if /^From /' < some_tag.mbox > /dev/null (詳見 這個問答。) 例如當初如果你選 「包含您的所有郵件」 而不是挑選特定標籤來備份, 那麼 gmail 會把所有郵件打成一大包, 就有可能會想把它拆開來。
  9. 如果需要把 some_tag.mbox 裡面的每封信的主題 (Subject)、 日期 (Date)、 其他標籤 (X-Gmail-Labels) 等三個欄位列出來, 可以這樣做: get-mail-header.perl Subject X-Gmail-Labels Date < some_tag.mbox 我寫的小程式 get-mail-header.perl 主要在把 base64 的亂碼轉回中文。 注意: 如果一個欄位拆成好幾列 (例如 X-Gmail-Labels 就會) 我的程式只會抓到第一列! 以後如果真的有需要再來修這個 bug。

確認備份完整之後 (多備幾份!) 就可以回到 gmail, 叫出 「所有郵件」, 把兩週或更舊的 e-mail 通通刪掉。 (先選取全部幾百或幾千封, 再取消最前面幾個幫) 把 「garbage」 標籤內的信件也通通刪掉。 再來就耐心地等它自動把垃圾桶內一個月以上的信件永久移除吧。 (我已經手殘清空垃圾桶了, 有點小後悔。) 我的 gmail 空間又變清爽了!

沒有留言:

張貼留言