歡迎光臨
每天分享高質量文章

Python開源專案介紹:用zmail簡單地發郵件

轉載自:Python中文社群     ID:python-china

傳送郵件是個很簡單的需求,但是在實際的使用中依然碰到了很多坑,因此建立了zmail這個專案,讓你使用python傳送郵件的過程盡可能簡單。


  1. GitHub:https://github.com/ZYunH/zmail


其他輪子的缺點:

服務端拒信:首要問題。很多其他的輪子需要自己構造MIME和郵件頭(通常優化了過程),但經常遭遇拒信,具體原因是其沒有正確的定義郵件頭,諸如From和To的頭資訊在使用SMTP時每家服務商檢查都會有細微的差別,以及一些平臺的差異(win10 localhost亂碼導致發件拒信),甚至在你發往不同的地址檢查也會有差別(國內發國外需要額外驗證一些資訊預防垃圾郵件)。

構造太麻煩:特別是新增附件的時候,有些還需要額外去自定義型別,體驗很差。

傳送太麻煩:你需要找到你服務商的smtp地址,埠號,有些服務商不是預設的埠(@http://163.com),有些只能SSL驗證(@http://qq.com),有些需要TLS(@gmailcom),一個不小心就傳送失敗。

解析郵件複雜:Bytes坑多,還有boundary,各種格式亂碼錯誤

引入過多的外部包:一些輪子引入了好幾個包,可能會造成包與原來的程式版本衝突(常見於requests之類的包),並且發生錯誤無法得到及時的檔案支援。在我嘗試傳送失敗後,使用django的email模組成功發送了郵件,但是django的目的顯然不是這個,使用一個如此大的框架來實現那麼小的需求顯然不合理(並且構造過程依然複雜)。

Zmail的優勢:

  • 自動填充大多數導致服務端拒信的頭資訊(From To LocalHost之類的)

  • 將一個字典對映為email,構造信件就像構造字典一樣簡單

  • 自動尋找郵件服務商埠號地址,自動選擇合適的協議(經過認證的)

  • 只依賴於python3,嵌入其他專案時無需煩惱

你可以使用zmail來:

  • 作為監控指令碼的傳送&接收郵件模組,及時傳遞資訊

  • 嵌入到已有的專案中實現郵件功能

  • 自定義郵件傳送過程,諸如準點傳送、定時傳送、自動監控等

安裝


  1. $ pip3 install zmail


也可以使用pip代替pip3

註意:zmail僅支援python3,不支援python2,使用前所有郵箱都要開啟SMTP功能,@http://163.com和@http://gmail.com 的郵箱需要額外設定SMTP密碼,網上很多資訊,具體自行百度google,這裡先行省略。

傳送郵件


  1. import zmail



  2. # 你的郵件內容



  3. mail_content = {



  4.    'subject': 'Success!',  # 隨便填寫



  5.    'content': 'This message from zmail!',  # 隨便填寫



  6. }





  7. # 使用你的郵件賬戶名和密碼登入伺服器



  8. server = zmail.server('12345678@qq.com, '你的qq郵箱密碼')



  9. # 傳送郵件



  10. server.send_mail('555555@qq.com', mail)


  • 為你的郵件新增附件,修改你的郵件內容 即可,其他內容同上


  1. # 你的郵件內容



  2. mail_content = {



  3.    'subject': 'Success!',  # 隨便填寫



  4.    'content': 'This message from zmail!',  # 隨便填寫



  5.    'attachments': '/Users/zyh/Documents/example.zip',  # 最好使用絕對路徑,若你電腦沒有這個檔案會造成錯誤



  6. }


  • 給多個信箱發件,修改傳送郵件 即可,其他內容同上


  1. # 傳送郵件



  2. server.send_mail(['555555@qq.com','666666@qq.com'], mail)


  • 新增額外的頭資訊,直接加入到mail_content即可

取回你的郵件

  • 取得最新的郵件


  1. import zmail



  2. server = zmail.server('yourmail@example.com, 'yourpassword')



  3. mail = server.get_latest()


  • 依據id取回郵件


  1. mail = server.get_mail(2)


  • 依據 (subject,after,before,sender)取回一個串列的郵件


  1. mail = server.get_mails(subject='GitHub',after='2018-1-1',sender='github')


示例中, 如果 'GitHub' 在郵件的主題中,這封郵件將會被匹配, 例如' [GitHub] Your password has changed'

sender亦是如此

  • 得到所有郵件的頭檔案資訊.一個由字典組成的串列,每個字典包含了所有能夠提取的頭檔案.


  1. mail_info = server.get_info()


  • 得到郵箱的資訊


  1. mailbox_info = server.stat()


結果為包含兩個整型的元組: (郵件的數量, 郵箱的大小).

解析你的郵件

在zmail中,接收到的郵件被對映為一個字典,你可以透過訪問python字典的形式來訪問你的郵件,字典中的所有key在下方郵件結構中有列出,例如


  1. subject = mail['subject']


展示你的郵件,使用 zmail.show()


  1. import zmail



  2. server = zmail.server('yourmail@example.com, 'yourpassword')



  3. mail = server.get_latest()



  4. zmail.show(mail)


輸出 :


  1. content-type multipart/mixed



  2. subject Success!



  3. to zmail_user



  4. from zmail



  5. date 2018-2-3 01:42:29 +0800



  6. boundary ===============9196441298519098157==



  7. content ['This message from zmail!']



  8. contents [[b'Content-Type: text/plain; charset="utf-8"', b'MIME-Version: 1.0', b'Content-Transfer-Encoding: base64', b'', b'VGhpcyBtZXNzYWdlIGZyb20gem1haWwh', b'']]



  9. attachments None



  10. id 5


郵件的結構

  • content-type: 郵件內容的型別

  • subject: 郵件主題

  • to:收件人

  • from:寄件人

  • date: 年-月-日 時間 時區

  • boundary: 如果郵件為multiple - - - parts,你可以得到其分界線

  • content: 郵件的文字內容(僅在text/plain時可以被解析)

  • contents: 郵件的body,裡麵包含著由分界線分割的每一個段落

  • attachments: None 或者 [['附件名稱;編碼方式','附件的二進位制內容']...]

  • id: 在郵箱中的id

獲得附件


  1. import zmail



  2. server = zmail.server('yourmail@example.com, 'yourpassword')



  3. mail = server.get_latest()



  4. zmail.get_attachment(mail)


你可以重新命名你的附件,使用


  1. zmail.get_attachment(mail,'example.zip')


支援的郵件服務商 串列中的郵件服務商已經被測試可正常使用

如果你的郵箱不在此列,前往Github提交issue。

本文作者

ZYunH,the best or nothing

部落格:zhihu.com/people/zhang-yun-hao-14

《Python人工智慧和全棧開發》2018年07月23日即將在北京開課,120天衝擊Python年薪30萬,改變速約~~~~

*宣告:推送內容及圖片來源於網路,部分內容會有所改動,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。


- END -



更多Python好文請點選【閱讀原文】哦

↓↓↓

贊(0)

分享創造快樂