天天看点

《Python自动化运维:技术与最佳实践》一2.3 发送电子邮件模块smtplib

本节书摘来自华章出版社《python自动化运维:技术与最佳实践》一书中的第2章,第2.3节,作者 (美)neil bergman ,更多章节内容可以访问云栖社区“华章计算机”公众号查看

电子邮件是最流行的互联网应用之一。在系统管理领域,我们常常使用邮件来发送告警信息、业务质量报表等,方便运维人员第一时间了解业务的服务状态。本节通过python的smtplib模块来实现邮件的发送功能,模拟一个smtp客户端,通过与smtp服务器交互来实现邮件发送的功能,这可以理解成foxmail的发邮件功能,在第一次使用之前我们需要配置smtp主机地址、邮箱账号及密码等信息,python 2.3或更高版本默认自带smtplib模块,无需额外安装。下面详细进行介绍。

smtp类定义:smtplib.smtp([host[, port[, local_hostname[, timeout]]]]),作为smtp的构造函数,功能是与smtp服务器建立连接,在连接成功后,就可以向服务器发送相关请求,比如登录、校验、发送、退出等。host参数为远程smtp主机地址,比如smtp.163.com;port为连接端口,默认为25;local_hostname的作用是在本地主机的fqdn(完整的域名)发送helo/ehlo(标识用户身份)指令,timeout为连接或尝试在多少秒超时。smtp类具有如下方法:

smtp.connect([host[, port]])方法,连接远程smtp主机方法,host为远程主机地址,port为远程主机smtp端口,默认25,也可以直接使用host:port形式来表示,例如:smtp.connect(“smtp.163.com”,“25”)。

smtp.login(user, password)方法,远程smtp主机的校验方法,参数为用户名与密码,如smtp.login(“[email protected]”,“sdjkg358”)。

smtp.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])方法,实现邮件的发送功能,参数依次为是发件人、收件人、邮件内容,例如:smtp.sendmail(“[email protected]”,“[email protected]”,body),其中body内容定义如下:

smtp.starttls([keyfile[, certfile]])方法,启用tls(安全传输)模式,所有smtp指令都将加密传输,例如使用gmail的smtp服务时需要启动此项才能正常发送邮件,如smtp.starttls()。

smtp.quit()方法,断开smtp服务器的连接。

下面通过一个简单示例帮助大家理解,目的是使用gmail向qq邮箱发送测试邮件,代码如下:

我们将收到一封这样的邮件,如图2-5所示。

《Python自动化运维:技术与最佳实践》一2.3 发送电子邮件模块smtplib

email.mime.multipart.mimemultipart([_subtype[, boundary[, _subparts[, _params]]]]),作用是生成包含多个部分的邮件体的mime对象,参数_subtype指定要添加到"content-type:multipart/subtype"报头的可选的三种子类型,分别为mixed、related、alternative,默认值为mixed。定义mixed实现构建一个带附件的邮件体;定义related实现构建内嵌资源的邮件体;定义alternative则实现构建纯文本与超文本共存的邮件体。

email.mime.audio.mimeaudio (_audiodata[, _subtype[, _encoder[, **_params]]]),创建包含音频数据的邮件体,_audiodata包含原始二进制音频数据的字节字符串。

email.mime.image.mimeimage(_imagedata[, _subtype[, _encoder[, **_params]]]),创建包含图片数据的邮件体,_imagedata是包含原始图片数据的字节字符串。

email.mime.text.mimetext (_text[, _subtype[, _charset]]),创建包含文本数据的邮件体,_text是包含消息负载的字符串,_subtype指定文本类型,支持plain(默认值)或html类型的字符串。

前面两小节介绍了python的smtplib及email模块的常用方法,那么两者在邮件定制到发送过程中是如何分工的?我们可以将email.mime理解成smtplib模块邮件内容主体的扩展,从原先默认只支持纯文本格式扩展到html,同时支持附件、音频、图像等格式,smtplib只负责邮件的投递即可。下面介绍在日常运营工作中邮件应用的几个示例。

示例1:实现html格式的数据报表邮件。

纯文本的邮件内容已经不能满足我们多样化的需求,本示例通过引入email.mime的mimetext类来实现支持html格式的邮件,支持所有html元素,包含表格、图片、动画、css样式、表单等。本示例使用html的表格定制美观的业务流量报表,实现代码如下:

【/home/test/smtplib/simple2.py】

代码运行结果如图2-6所示,我们将业务日志分析结果定期推送给管理员,以方便管理员了解业务的服务情况。

《Python自动化运维:技术与最佳实践》一2.3 发送电子邮件模块smtplib

示例2:实现图文格式的服务器性能报表邮件。

示例1通过mimetext类来实现html格式的邮件,当要求包含图片数据的邮件内容时,需要引用mimeimage类,若邮件主体由多个mime对象组成,则同时需引用mimemultipart类来进行组装。本示例通过mimetext与mimeimage类的组合来实现图文格式的服务器性能报表邮件的定制,实现代码如下:

【/home/test/smtplib/simple3.py】

代码运行结果如图2-7所示,我们将业务服务器性能数据定期推送给管理员,以方便管理员了解业务的服务情况。

《Python自动化运维:技术与最佳实践》一2.3 发送电子邮件模块smtplib

示例3:实现带附件格式的业务服务质量周报邮件。

本示例通过mimetext与mimeimage类的组合,实现图文邮件格式。另通过mimetext类再定义content-disposition属性来实现带附件的邮件。我们可以利用这些丰富的特性来定制周报邮件,如业务服务质量周报。实现代码如下:

【/home/test/smtplib/simple4.py】

代码运行结果如图2-8所示,实现了发送业务服务质量周报的邮件功能。

《Python自动化运维:技术与最佳实践》一2.3 发送电子邮件模块smtplib