2024年9月19日 星期四

批次解碼 email 的 pdf 加密附件

退休以後跟人的互動突然少了很多。 每個月從不令人失望、 一定會發 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, 覺得它現在越來越厲害了。

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。