专栏首页北京马哥教育Python开源项目介绍:用zmail简单地发邮件

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

转载自:Python中文社区 ID:python-china

发送邮件是个很简单的需求,但是在实际的使用中依然碰到了很多坑,因此创建了zmail这个项目,让你使用python发送邮件的过程尽可能简单。

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来:

  • 作为监控脚本的发送&接收邮件模块,及时传递信息
  • 嵌入到已有的项目中实现邮件功能
  • 自定义邮件发送过程,诸如准点发送、定时发送、自动监控等

安装

$ pip3 install zmail

也可以使用pip代替pip3

注意:zmail仅支持python3,不支持python2,使用前所有邮箱都要开启SMTP功能,@http://163.com和@http://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 zmail
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] Your password has changed'

sender亦是如此

  • 得到所有邮件的头文件信息.一个由字典组成的列表,每个字典包含了所有能够提取的头文件.
mail_info = server.get_info()
  • 得到邮箱的信息
mailbox_info = server.stat()

结果为包含两个整型的元组: (邮件的数量, 邮箱的大小).

解析你的邮件

在zmail中,接收到的邮件被映射为一个字典,你可以通过访问python字典的形式来访问你的邮件,字典中的所有key在下方邮件结构中有列出,例如

subject = mail['subject']

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

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

输出 :

content-type multipart/mixed
subject Success!
to zmail_user
from zmail<zmail@126.com>
date 2018-2-3 01:42:29 +0800
boundary ===============9196441298519098157==
content ['This message from zmail!']
contents [[b'Content-Type: text/plain; charset="utf-8"', b'MIME-Version: 1.0', b'Content-Transfer-Encoding: base64', b'', b'VGhpcyBtZXNzYWdlIGZyb20gem1haWwh', b'']]
attachments None
id 5

邮件的结构

  • content-type: 邮件内容的类型
  • subject: 邮件主题
  • to:收件人
  • from:寄件人
  • date: 年-月-日 时间 时区
  • boundary: 如果邮件为multiple - - - parts,你可以得到其分界线
  • content: 邮件的文本内容(仅在text/plain时可以被解析)
  • contents: 邮件的body,里面包含着由分界线分割的每一个段落
  • attachments: None 或者 [['附件名称;编码方式','附件的二进制内容']...]
  • id: 在邮箱中的id

获得附件

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

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

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 -


本文分享自微信公众号 - 马哥Linux运维(magedu-Linux)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python 发送邮件脚本

    ? 作者:Jesse-csdn 来源: http://blog.csdn.net/l2show/ar...

    小小科
  • 5分钟教你学会Django系统错误监控

    话不多说,直入正题。 先上图,看一下监控的效果。 如下是监控我们网站系统错误的邮件。包含了请求的url地址,以及详细的异常信息。 一、监控所有的request...

    小小科
  • 5分钟教你学会Django系统错误监控

    django.utils.log.AdminEmailHandler为django处理系统日志发送邮件的handler

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

    发送邮件是个很简单的需求,但是在实际的使用中依然碰到了很多坑,因此创建了zmail这个项目,让你使用python发送邮件的过程尽可能简单。

    Python中文社区
  • 如何使用 Spring Boot 开发邮件系统?

    互联网发展到现在,邮件服务已经成为互联网企业中必备功能之一,应用场景非常广泛,比较常见的有:用户注册、忘记密码、监控提醒、企业营销等。

    纯洁的微笑
  • 学学Mac的邮箱交互规则,让邮箱更听话

    今天早上上班时,打开Apple store,发现探索中首推了一篇《让你的邮件更听话》的详情,于是点开看了下,发现写的是Mac自带的邮箱设置规则功能,确实做的很好...

    宇相
  • 发送邮件那些事

    世界的第一封电子邮件 1969年10月世界上的第一封电子邮件是由计算机科学家Leonard K.教授发给他的同事的一条简短消息。 据《互联网周刊》报道世界上的第...

    纯洁的微笑
  • Python 发送邮件脚本

    ? 作者:Jesse-csdn 来源: http://blog.csdn.net/l2show/ar...

    小小科
  • 深度揭秘|你所不知道的邮件安全面临的风险

    电子邮件越来越多地应用于社会生产、生活、学习的各个方面,在不同领域发挥着举足轻重的作用,在享受电子邮件带来便利的时候,不法分子常常通过篡改邮件、病毒邮件、垃圾邮...

    安恒信息
  • 邮件发送功能开发

    作为一名.Net开发,"邮件发送"功能的开发和使用是必须要掌握的,因为这个功能作为“消息推送”的一种手段经常出现在各种.Net系统中,所以本文将对.Net平台下...

    郑小超.

扫码关注云+社区

领取腾讯云代金券