专栏名称: 马哥Linux运维
马哥linux致力于linux运维培训,连续多年排名第一,订阅者可免费获得学习机会和相关Linux独家实战资料!
目录
相关文章推荐
运维  ·  再见,CDN 巨头:Akamai 宣布 ... ·  3 天前  
51好读  ›  专栏  ›  马哥Linux运维

Python开源项目介绍:用zmail简单地发邮件

马哥Linux运维  · 公众号  · 运维  · 2018-03-25 18:00

正文

转载自: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('[email protected], '你的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(['[email protected]','[email protected]'], mail)


  • 添加额外的头信息,直接加入到mail_content即可

取回你的邮件

  • 取得最新的邮件


  1. import zmail



  2. server = zmail.server('[email protected], '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('[email protected], '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







请到「今天看啥」查看全文