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

时间:2022-04-25 22:49:33

运行环境: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
Python自动化运维笔记(六):使用smtplib模块发送电子邮件

参考代码如下:

# -*- 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 = "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连接

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

值得一提的是,我刚开始是按照书上的代码进行照搬的,书上的操作环境是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模块来实现邮件的个性化定制。
如果是想实现更多的功能,请参考廖雪峰的这篇教程(链接