退休以後跟人的互動突然少了很多。 每個月從不令人失望、 一定會發 mail 問候我的, 就只剩下銀行/信用卡/電信業者了。 以前太忙想, 到要打密碼就覺得很累, 這些帳單 mail 直接存檔, 一年下來也有好幾十封。 從學校的 zimbra 伺服器匯出、 解壓縮, 得到一堆 *.eml 檔。 這篇的目的就是想要只打一次密碼, 就把所有附件當中的 pdf 檔抓出來、 解密另存新檔。 如果你下載回來的 email 是 *.mbox 格式, 可能也大略適用。
請先安裝 procmail mpack qpdf 三個套件。
另外, 如果你有用過 mutt 讀離線信件 (以前有一陣子我都這樣做),
就知道可以拿它來檢視 mbox 檔、 查看附件的個數與檔名:
mutt -f abc.mbox
。
若是 eml 格式, 必須先用 (來自 procmail 套件的) formail
把 eml 格式轉成 mbox 格式:
formail -b < abc.eml > abc.mbox
或者略過不用它也沒關係, 並不影響以下流程。
我們先手動測試單獨一個 eml 檔。
Zimbra 拿郵件的標題當作檔案名稱, 所以有時檔名裡面會有空格,
或是有可能導致 shell 過敏的各種標點符號 (例如方括弧)。
總之, 凡是用到檔名的地方, 一律用雙引號把它括起來, 這是最保險的方法;
我原先漏了幾處, 害我浪費好多時間除錯。
假設我有一個檔案 "0000075322-玩很大銀行2024年7月份『綜合對帳單 』.eml"
先把裡面的附件全部抓出來:
munpack -qf "0000075322-玩很大銀行2024年7月份『綜合對帳單 』.eml"
目前目錄出現兩個檔名看似亂碼的檔案:
-rw------- 1 ckhung ckhung 13476 9月 19 10:04 '=Xutf-8XBX57ac5ZCI5bCN5biz5ZauLnBkZg==X=.desc' -rw-r--r-- 1 ckhung ckhung 526481 9月 19 10:04 '=Xutf-8XBX57ac5ZCI5bCN5biz5ZauLnBkZg==X='略過最前面的 "=Xutf-8XBX" 跟最後面的 "X=", 當中那一段其實是 base64 編碼, 可以這樣還原:
echo "57ac5ZCI5bCN5biz5ZauLnBkZg==" | base64 -d
得到原始檔案名稱為 「綜合對帳單.pdf」
於是用 qpdf 去除密碼: qpdf --decrypt --password=[自己的身份證字號] "57ac5ZCI5bCN5biz5ZauLnBkZg==" 綜合對帳單.pdf
就得到我們想要的結果, 無加密的 「綜合對帳單.pdf」。
台電、電信業者、大部分的銀行都是用身份證字號當密碼。
自來水公司則是採用網站密碼加密,我懶得另外處理,就把它省略了。
有些郵件裡面含有一大堆 jpg 或 gif 圖片附件,
用 munpack 處理時, 會把目前目錄弄得亂七八糟。
所以建議建立一個空的臨時工作目錄, 到那裡去下指令。
把上面這些邏輯綜合起來, 並且變成迴圈, 就得到我的小程式:
xtbankst.sh
每測試一家銀行或公司成功, 就把它的檔名格式放到
$all_files 變數裡, 取代原來的範例銀行名稱。
這樣執行: ./xtbankst.sh 來源目錄 目的地目錄
它就會把來源目錄底下所有符合檔名格式的檔案裡面的 pdf 全部抓出來,
放到目的地目錄裡面變成無密碼 pdf 檔。
我在每個檔名前面加上 yymm 四位數字,
其中西元年份末兩位 (yy) 可能需要從民國年份轉換過來。
如果你用的是 gmail, 那就必須先把每一個 mbox 檔拆成一封一封獨立的 mbox檔。 網路上查到的方法 (用 formail -ds ...) 失敗, 只產生大約相同大小的單一檔案。 會不會是不同軟體產生的格式有一點大同小異? 還好這只是一個很簡單的文字檔, 那就自己寫一個 perl 小程式吧! 在剛剛 xtbankst.sh 相同的 gist 裡面有一個 split-gmail.pl, 只針對 gmail 測試過。 當我的程式無法從郵件檔案名稱判斷年份月份的時候, 就固定用 9999 放在附件檔案名稱前面。 這部分我沒在用, 所以就懶得處理了。
產生這些 pdf 檔到底要拿來幹嘛? 我也不知道。 是說, 過程當中順便練習使用 ChatGPT, 覺得它現在越來越厲害了。
沒有留言:
張貼留言
因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。