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的郵件功能了。
問題得到解決

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章