1. 程式人生 > >airflow EmailOperator 傳送郵件 附件檔名丟失或亂碼問題

airflow EmailOperator 傳送郵件 附件檔名丟失或亂碼問題

開始使用airflow

最早開始使用airflow是因為公司的服務過度 依賴crontab了,完全通過時間進行任務排程,而且不便於追蹤任務執行情況,也不好處理任務之間的依賴關係。更不要說管理多伺服器的crontab問題了。

於是自己進行軟體選型,查閱相關資料。因為本身是做資料工作的,不希望只是一個簡簡單單的crontab功能升級,於是選擇了airflow。

airflow的主要特點如下:

  • 我們可以將一些常做的巡檢任務,定時指令碼(如 crontab ),ETL處理,監控等任務放在 airflow 上集中管理,甚至都不用再寫監控指令碼,作業出錯會自動傳送日誌到指定人員郵箱,低成本高效率地解決生產問題。
  • Airflow 適用於排程作業較為複雜,特別是各作業之間的依賴關係複雜的情況​

備選是cronsun

  • cronsun 是一個分散式任務系統,單個結點和 *nix 機器上的 crontab 近似。支援介面管理機器上的任務,支援任務失敗郵件提醒,安裝簡單,使用方便,是替換 crontab 一個不錯的選擇)

具體關於任務排程可以參考之前轉發的一篇文章,淺談工作流排程系統

使用 EmailOperator 模組傳送郵件

當然寫本篇文章的目的是解決使用airflow時遇到的傳送郵件問題,我在使用EmailOperator傳送xlsx附件的時候遇到了附件檔名丟失問題,有的客戶端可以正常接收(例如mac的郵件),但是伺服器端和Foxmail則遇到了問題,因為之前使用smtp傳送郵件的時候遇到過類似問題,所以決定去airflow的原始碼中一探究竟。
附件檔名丟失

修改原始碼處理檔名問題

檢視原始碼追蹤到了問題,EmailOperator使用了 from airflow.utils.email import send_email,通過email這個類完成郵件的最終傳送,所以講問題定位到了這裡。
第84行

part['Content-Disposition'] = 'attachment; filename="%s"' % basename
part['Content-ID'] = '<%s>' % basename

修改為

# update by frone due to email attachment reason
part.add_header('Content-Disposition'
, 'attachment', filename=('utf-8', '', basename)) part.add_header('Content-ID','<%s>'%basename)

最終成功解決問題,可以正常使用airflow的郵件功能了。
問題得到解決