Python自动化运维笔记(六):使用smtplib模块发送电子邮件

来源:互联网 发布:伦敦生活 知乎 编辑:程序博客网 时间:2024/06/07 01:17

运行环境:Python3.6Windwos10 RS1Pycharm
参考书籍—《Python自动化运维--技术与最佳实践》刘天斯著


模块介绍

我们在监测系统状态发送警报信息,或者业务质量报表的时候,可以通过发送邮件来第一时间获取服务状态。SMTP是发送邮件的协议,POP是接收邮件的协议。Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。PythonSMTP支持有smtplibemail两个模块,email负责构造邮件,smtplib负责发送邮件。
所以我们可以使用smtplib模块来实现邮件收发功能,模拟一个smtp客户端。在Python2.3以上的版本中已经自带smtplib模块。


模块的使用

常用类SMTP

SMTP类是smtp模块中最常用的类:有关于类的定义:

smtplib.SMTP(host[,port[,local_hostname[,,timeout]]])# 可以完成登录、校验、发送、退出等# host参数为远程smtp主机地址,比如stmp.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("18801457794@139.com",'123456').SMTP.sendmail(from_addr,to_addrs,msg[,mail_options,rcpt_options])      # 实现邮件的发送功能,参数依次为发件人,收件人,邮件内容,例如:SMTP.sendmail("python@163.com",'404408853@qq.com',body),其中body内容定义如下:    """From:python@163.com    To:404408853@qq.com    Subject:test mail    test mail body"""SMTP.starttls([keyfile[,certfile]])     # 启用TLS(安全传输)模式,所有SMTP指令都讲加密传输,例如使用gmail的stmp服务器时需要启动此项才能正常发送邮件SMTP.quit()     # 端口smtp服务器的连接

邮件发送代码示例

我用的是QQ邮箱QQ邮箱发送邮件,下面附上一张QQ邮箱的配置参考图,SMTP默认端口25
参考图

参考代码如下:

# -*- coding: utf-8 -*-# @Time : 2017/10/3 11:24 # @File : smtplibTest.py # @Software: PyCharmimport smtplib## user = "你的邮箱地址"# password = "你的邮箱密码"HOST = "smtp.qq.com"  # 定义smtp主机SUBJECT = "This is my first Python Email"  # 定义邮件主题TO = "2479696353@qq.com"  # 定义邮件收件人FROM = "962457839@qq.com" # 定义邮件发件人text = "python test mail"  # 邮件的内容BODY = "\r\n".join((  # 组装sendmail方法的邮件主体内容,各段以"\r\n"进行分隔    "From:%s" % FROM,    "To:%s" % TO,    "Subject:%s" % SUBJECT,    "",    text))server = smtplib.SMTP()  # 创建一个SMTP对象server.connect(HOST, "25")  # 通过connect方法连接smtp主机server.starttls()  # 启动安全传输模式server.login("962457839@qq.com", "**MyPassword**")  # 邮件账户登录校验server.sendmail(FROM, TO, BODY)  # 邮件发送server.quit()  # 断开smtp连接

运行效果:
运行效果

值得一提的是,我刚开始是按照书上的代码进行照搬的,书上的操作环境是Python2.6,而我使用的是Python3.6。在BODY内容时会抛出异常,一查原因原来是在Python2中,string 模块中有一个join()函数,用于以特定的分隔符分隔源变量中的字符串,将其作为新的元素加入到一个列表中;但是在Python3中,string模块中取消了join()函数,join()函数作为一个全局函数被使用。
所以可以按照下面两个作为参考对变量BODY进行更改:

Python2环境中

import string# 组装sendmail方法的邮件主体内容,各段以"\r\n"进行分隔BODY = string.join((    "From: %s" % FROM,    "To: %s" % TO,    "Subject: %s" % SUBJECT,    ""    text    ),"\r\n") 

Python3环境中

import string# 组装sendmail方法的邮件主体内容,各段以"\r\n"进行分隔BODY = "\r\n".join((      "From:%s" % FROM,    "To:%s" % TO,    "Subject:%s" % SUBJECT,    "",    text))

另外可以使用email模块来实现邮件的个性化定制。
如果是想实现更多的功能,请参考廖雪峰的这篇教程(链接)

原创粉丝点击