发送电子邮件模块smtplib
一、简介
电子邮件是最流行的互联网应用之一。在系统管理领域,我们常常使用邮件来发送告警信息、业务质量报表等,方便运维人员第一时间了解业务的服务状态。本节通过python的smtplib模块来实现邮件的发送功能,模拟一个smtp客户端,通过与smtp服务器交互来实现邮件发送功能,这可以理解成foxmail的发送邮件功能,在第一次使用之前我们需要配置smtp主机地址、邮箱账号及密码等信息。Python自带smtplib模块,无需额外安装。下面进行详细介绍。
二、smtplib模块的常用类与方法
注:建议使用QQ邮箱作为FROM发送地址,否则可能会出现收不到发布出去的情况。
SMTP类定义:smtp.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(“python_2014@163.com”,”abcd1234″)。
-
SMTP.sendmail(from_addr,to_addr,msg[,mail_options,rcpt_options])方法,实现邮件的发送功能,参数依次为发件人、收件人、邮件内容,例如:SMTP.sendmail(“python_2014@163.com”,”demo@domail.com”,body),其中body内容定义如下:
“”” From:python_2014@163.com To:demo@domail.com Subject:test mail test mail body
“”” |
-
SMTP.starttls([keyfile[,certfile]]) 方法启用TLS(安全传输)模式,所有SMTP指令都将加密传输,例如使用gmail的smtp服务时需要开启此项才能正常发送邮件,如SMTP.starttls()。
-
SMTP.quit()方法,断开smtp服务器的连接。
三、关于SMTP协议状态码的含义
220:服务就绪。
250:请求动作正确完成(HELO、MAIL FROM、RCPT TO、QUIT指令执行成功会返回此信息)。
235:认证通过。
221:正在处理。
354:开始发送邮件内容,提示以特殊行.结束邮件内容。
500:语法错误,命令不能识别。
552:中断处理
四、一个实例
下面通过一个简单的事例帮助大家理解,目的是使用163向QQ邮箱发送测试邮件,代码如下:
# 导入smtplib模块 In [1]: import smtplib # 定义SMTP主机 In [2]: HOST = “smtp.163.com” # 定义邮件主题
In [3]: SUBJECT = “这是一封由Python自动发出的邮件” # 定义邮件发件人 In [4]: FROM = “zhangyj_public@163.com” # 定义邮件收件人 In [5]: TO = “zhangyj_public@qq.com” # 定义邮件正文 In [6]: text = “当你收到这封邮件的时候,这已经说明你的发送邮件脚本编写成功!” # 组装sendmail方法的邮件主体内容,各段以”\r\n”进行分隔 In [7]: BODY = “\r\n”.join(( …: “From: {815ac408a99669c280d890a3c1592527154068adde55fb55fc5b84dc9fd9f61b}s” {815ac408a99669c280d890a3c1592527154068adde55fb55fc5b84dc9fd9f61b} FROM, …: “To: {815ac408a99669c280d890a3c1592527154068adde55fb55fc5b84dc9fd9f61b}s” {815ac408a99669c280d890a3c1592527154068adde55fb55fc5b84dc9fd9f61b} TO, …: “Subject: {815ac408a99669c280d890a3c1592527154068adde55fb55fc5b84dc9fd9f61b}s” {815ac408a99669c280d890a3c1592527154068adde55fb55fc5b84dc9fd9f61b} SUBJECT, …: “”, …: text)) # 创建一个SMTP()对象 In [8]: server = smtplib.SMTP() # 通过connect方法连接smtp主机 In [9]: server.connect(HOST, “25”) # 服务就绪,显示欢迎信息 Out[9]: (220, b’163.com Anti-spam GT for Coremail System (163com[20141201])’) # 发送邮箱账号和密码 In [10]: server.login(“zhangyj_public@163.com”, “********(*代表你的密码)”) # 认证通过 Out[10]: (235, b’Authentication successful’) # 邮件发送,因为内容字符长度问题,所以要在BODY后边加上”encode(‘UTF-8’)”来确定字符集 In [11]: server.sendmail(FROM, [TO], BODY.encode(‘UTF-8’)) # 发送成功 Out[11]: {} In [12]: server.quit() # 退出登录,断开SMTP连接 Out[12]: (221, b’Bye’) |
若发送成功,如下图所示(你发的邮件有可能会在垃圾邮件里):
附:完整的发送邮件脚本(在内网使用代理服务器连通外网的情况下)
”’
Author:zhangyj ”’ # 第一二行不解释 # 设置代理服务器 |