Python开源项目之用zmail简单发邮件及源码
2018-03-21 14:16:30
3131浏览
发送邮件是个很简单的需求,但是在实际的使用中依然碰到了很多坑,因此创建了zmail这个项目,让你使用python发送邮件的过程尽可能简单。
其他轮子的缺点:
服务端拒信:首要问题。很多其他的轮子需要自己构造MIME和邮件头(通常优化了过程),但经常遭遇拒信,具体原因是其没有正确的定义邮件头,诸如From和To的头信息在使用SMTP时每家服务商检查都会有细微的差别,以及一些平台的差异(win10localhost乱码导致发件拒信),甚至在你发往不同的地址检查也会有差别(国内发国外需要额外验证一些信息预防垃圾邮件)。
构造太麻烦:特别是添加附件的时候,有些还需要额外去自定义类型,体验很差。
发送太麻烦:你需要找到你服务商的smtp地址,端口号,有些服务商不是默认的端口,有些只能SSL验证,有些需要TLS,一个不小心就发送失败。
解析邮件复杂:Bytes坑多,还有boundary,各种格式乱码错误
引入过多的外部包:一些轮子引入了好几个包,可能会造成包与原来的程序版本冲突(常见于requests之类的包),并且发生错误无法得到及时的文档支持。在我尝试发送失败后,使用django的email模块成功发送了邮件,但是django的目的显然不是这个,使用一个如此大的框架来实现那么小的需求显然不合理(并且构造过程依然复杂)。
Zmail的优势:
自动填充大多数导致服务端拒信的头信息(FromToLocalHost之类的)
将一个字典映射为email,构造信件就像构造字典一样简单
自动寻找邮件服务商端口号地址,自动选择合适的协议(经过认证的)
只依赖于python3,嵌入其他项目时无需烦恼
你可以使用zmail来:
作为监控脚本的发送&接收邮件模块,及时传递信息
嵌入到已有的项目中实现邮件功能
自定义邮件发送过程,诸如准点发送、定时发送、自动监控等
安装
$pip3installzmail
也可以使用pip代替pip3
注意:zmail仅支持python3,不支持python2,使用前所有邮箱都要开启SMTP功能,有些邮箱需要额外设定SMTP密码,网上很多信息,具体自行百度google,这里先行省略。
发送邮件
importzmail
#你的邮件内容
mail_content={
'subject':'Success!',#随便填写
'content':'Thismessagefromzmail!',#随便填写
}
#使用你的邮件账户名和密码登录服务器
server=zmail.server('12345678@qq.com,'你的qq邮箱密码')
#发送邮件
server.send_mail('555555@qq.com',mail)
为你的邮件添加附件,修改你的邮件内容即可,其他内容同上
#你的邮件内容
mail_content={
'subject':'Success!',#随便填写
'content':'Thismessagefromzmail!',#随便填写
'attachments':'/Users/zyh/Documents/example.zip',#最好使用绝对路径,若你电脑没有这个文件会造成错误
}
给多个信箱发件,修改发送邮件即可,其他内容同上
#发送邮件
server.send_mail(['555555@qq.com','666666@qq.com'],mail)
添加额外的头信息,直接加入到mail_content即可
取回你的邮件
取得最新的邮件
importzmail
server=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]Yourpasswordhaschanged'
sender亦是如此
得到所有邮件的头文件信息.一个由字典组成的列表,每个字典包含了所有能够提取的头文件.
mail_info=server.get_info()
得到邮箱的信息
mailbox_info=server.stat()
结果为包含两个整型的元组:(邮件的数量,邮箱的大小).
解析你的邮件
在zmail中,接收到的邮件被映射为一个字典,你可以通过访问python字典的形式来访问你的邮件,字典中的所有key在下方邮件结构中有列出,例如
subject=mail['subject']
展示你的邮件,使用zmail.show()
importzmail
server=zmail.server('yourmail@example.com,'yourpassword')
mail=server.get_latest()
zmail.show(mail)
输出:
content-typemultipart/mixed
subjectSuccess!
tozmail_user
fromzmail
date2018-2-301:42:29+0800
boundary===============9196441298519098157==
content['Thismessagefromzmail!']
contents[[b'Content-Type:text/plain;charset="utf-8"',b'MIME-Version:1.0',b'Content-Transfer-Encoding:base64',b'',b'VGhpcyBtZXNzYWdlIGZyb20gem1haWwh',b'']]
attachmentsNone
id5
邮件的结构
content-type:邮件内容的类型
subject:邮件主题
to:收件人
from:寄件人
date:年-月-日时间时区
boundary:如果邮件为multiple---parts,你可以得到其分界线
content:邮件的文本内容(仅在text/plain时可以被解析)
contents:邮件的body,里面包含着由分界线分割的每一个段落
attachments:None或者[['附件名称;编码方式','附件的二进制内容']...]
id:在邮箱中的id
获得附件
importzmail
server=zmail.server('yourmail@example.com,'yourpassword')
mail=server.get_latest()
zmail.get_attachment(mail)
你可以重命名你的附件,使用
zmail.get_attachment(mail,'example.zip')
支持的邮件服务商列表中的邮件服务商已经被测试可正常使用
最后想要了解更多关于Python发展前景趋势,请关注扣丁学堂python培训官网、微信等平台,扣丁学堂IT职业在线学习教育平台为您提供最新的Python视频教程系统,通过千锋扣丁学堂金牌讲师在线录制的Python视频教程课程,让你快速掌握Python从入门到精通开发实战技能。扣丁学堂Python开发工程师技术交流群:279521237。
【关注微信公众号获取更多学习资料】
查看更多关于"Python开发资讯"的相关文章>>
标签:
Python视频教程
Python基础教程
Python爬虫
Python培训
Python开发工程师