Zmail--讓郵件變得簡單(python)

Zmail--讓郵件變得簡單(python)

來自專欄 Python中文社區4 人贊了文章

發送郵件是個很簡單的需求,但是在實際的使用中依然碰到了很多坑,因此創建了zmail這個項目,讓你使用python發送郵件的過程儘可能簡單。

GitHub地址:github.com/ZYunH/zmail ,覺得ok請star或者fork!!!

其他輪子的缺點:

  • 服務端拒信:首要問題。很多其他的輪子需要自己構造MIME和郵件頭(通常優化了過程),但經常遭遇拒信,具體原因是其沒有正確的定義郵件頭,諸如From和To的頭信息在使用SMTP時每家服務商檢查都會有細微的差別,以及一些平台的差異(win10 localhost亂碼導致發件拒信),甚至在你發往不同的地址檢查也會有差別(國內發國外需要額外驗證一些信息預防垃圾郵件)。
  • 構造太麻煩:特別是添加附件的時候,有些還需要額外去自定義類型,體驗很差。
  • 發送太麻煩:你需要找到你服務商的smtp地址,埠號,有些服務商不是默認的埠(@163.com),有些只能SSL驗證(@qq.com),有些需要TLS(@gmailcom),一個不小心就發送失敗。
  • 解析郵件複雜:Bytes坑多,還有boundary,各種格式亂碼錯誤
  • 引入過多的外部包:一些輪子引入了好幾個包,可能會造成包與原來的程序版本衝突(常見於requests之類的包),並且發生錯誤無法得到及時的文檔支持。在我嘗試發送失敗後,使用django的email模塊成功發送了郵件,但是django的目的顯然不是這個,使用一個如此大的框架來實現那麼小的需求顯然不合理(並且構造過程依然複雜)。

Zmail的優勢:

  • 自動填充大多數導致服務端拒信的頭信息(From To LocalHost之類的)
  • 將一個字典映射為email,構造信件就像構造字典一樣簡單
  • 自動尋找郵件服務商埠號地址,自動選擇合適的協議(經過認證的)
  • 只依賴於python3,嵌入其他項目時無需煩惱

你可以使用zmail來:

  • 作為監控腳本的發送&接收郵件模塊,及時傳遞信息
  • 嵌入到已有的項目中實現郵件功能
  • 自定義郵件發送過程,諸如準點發送、定時發送、自動監控等

安裝

$ pip3 install zmail

也可以使用pip代替pip3

注意:zmail僅支持python3,不支持python2

使用前注意,所有郵箱都要開啟SMTP功能,@163.com和@gmail.com 的郵箱需要額外設定SMTP密碼,網上很多信息,具體自行百度google,這裡先行省略。

發送郵件

import zmail# 你的郵件內容mail_content = { subject: Success!, # 隨便填寫 content: This message from zmail!, # 隨便填寫}# 使用你的郵件賬戶名和密碼登錄伺服器server = zmail.server(12345678@qq.com, 你的qq郵箱密碼)# 發送郵件server.send_mail(555555@qq.com, mail)

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

# 你的郵件內容mail_content = { subject: Success!, # 隨便填寫 content: This message from zmail!, # 隨便填寫 attachments: /Users/zyh/Documents/example.zip, # 最好使用絕對路徑,若你電腦沒有這個文件會造成錯誤}

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

# 發送郵件server.send_mail([555555@qq.com,666666@qq.com], mail)

  • 添加額外的頭信息,直接加入到mail_content即可

取回你的郵件

  • 取得最新的郵件

import zmailserver = zmail.server(yourmail@example.com, yourpassword)mail = server.get_latest()

  • 依據id取回郵件

mail = server.get_mail(2)

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

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

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

sender亦是如此

  • 得到所有郵件的頭文件信息.一個由字典組成的列表,每個字典包含了所有能夠提取的頭文件.

mail_info = server.get_info()

  • 得到郵箱的信息

mailbox_info = server.stat()

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

解析你的郵件

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

subject = mail[subject]

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

import zmailserver = zmail.server(yourmail@example.com, yourpassword)mail = server.get_latest()zmail.show(mail)

輸出 :

content-type multipart/mixedsubject Success!to zmail_userfrom zmail<zmail@126.com>date 2018-2-3 01:42:29 +0800boundary ===============9196441298519098157==content [This message from zmail!]contents [[bContent-Type: text/plain; charset="utf-8", bMIME-Version: 1.0, bContent-Transfer-Encoding: base64, b, bVGhpcyBtZXNzYWdlIGZyb20gem1haWwh, b]]attachments Noneid 5

郵件的結構

  • content-type: 郵件內容的類型
  • subject: 郵件主題
  • to:收件人
  • from:寄件人
  • date: 年-月-日 時間 時區
  • boundary: 如果郵件為multiple parts,你可以得到其分界線
  • content: 郵件的文本內容(僅在text/plain時可以被解析)
  • contents: 郵件的body,裡面包含著由分界線分割的每一個段落
  • attachments: None 或者 [[附件名稱;編碼方式,附件的二進位內容]...]
  • id: 在郵箱中的id

獲得附件

import zmailserver = zmail.server(yourmail@example.com, yourpassword)mail = server.get_latest()zmail.get_attachment(mail)

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

zmail.get_attachment(mail,example.zip)

支持的郵件服務商

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

如果你的郵箱不在此列,請不要擔心,目前尚未發現不支持的郵箱.如果你發現任何問題,請在GitHub上告知於我

更多內容請前往Github的ReadMe

推薦閱讀:

爬蟲工程師是幹什麼的
Python and CFD --2d Diffusion
win10使用Ubuntu+VSCode編寫python
Docker入門

TAG:Python | Python庫 | Python3x |