运行环境:
Python3.6
,Windwos10 RS1
,Pycharm
参考书籍—《Python自动化运维--技术与最佳实践》
刘天斯著
我们在监测系统状态发送警报信息,或者业务质量报表的时候,可以通过发送邮件来第一时间获取服务状态。SMTP
是发送邮件的协议,POP
是接收邮件的协议。Python
内置对SMTP
的支持,可以发送纯文本邮件、HTML邮件
以及带附件的邮件。Python
对SMTP
支持有smtplib
和email
两个模块,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("[email protected]",'123456').
SMTP.sendmail(from_addr,to_addrs,msg[,mail_options,rcpt_options]) # 实现邮件的发送功能,参数依次为发件人,收件人,邮件内容,例如:SMTP.sendmail("[email protected]",'[email protected]',body),其中body内容定义如下:
"""From:[email protected]
To:[email protected]
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: PyCharm
import smtplib
#
# user = "你的邮箱地址"
# password = "你的邮箱密码"
HOST = "smtp.qq.com" # 定义smtp主机
SUBJECT = "This is my first Python Email" # 定义邮件主题
TO = "[email protected]" # 定义邮件收件人
FROM = "[email protected]" # 定义邮件发件人
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("[email protected]", "**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模块
来实现邮件的个性化定制。
如果是想实现更多的功能,请参考廖雪峰的这篇教程(链接)