python smtplib模块发送SSL/TLS安全邮件实例
python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
smtp协议的基本命令包括:
HELO向服务器标识用户身份
MAIL初始化邮件传输mailfrom:
RCPT标识单个的邮件接收人;常在MAIL命令后面,可有多个rcptto:
DATA在单个或多个RCPT命令后,表示所有的邮件接收人已标识,并初始化数据传输,以.结束
VRFY用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
EXPN验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
HELP查询服务器支持什么命令
NOOP无操作,服务器应响应OK
QUIT结束会话
RSET重置会话,当前传输被取消
MAILFROM指定发送者地址
RCPTTO指明的接收者地址
一般smtp会话有两种方式,一种是邮件直接投递,就是说,比如你要发邮件給zzz@163.com,那就直接连接163.com的邮件服务器,把信投給zzz@163.com;另一种是验证过后的发信,它的过程是,比如你要发邮件給zzz@163.com,你不是直接投到163.com,而是通过自己在sina.com的另一个邮箱来发。这样就要先连接sina.com的smtp服务器,然后认证,之后在把要发到163.com的信件投到sina.com上,sina.com会帮你把信投递到163.com。
第一种方式的命令流程基本是这样:
1.helo
2.mailfrom
3.rcptto
4.data
5.quit
但是第一种发送方式一般有限制的,就是rcptto指定的这个邮件接收者必须在这个服务器上存在,否则是不会接收的。先看看代码:
#-*-encoding:gb2312-*- importos,sys,string importsmtplib
#邮件服务器地址 mailserver="smtp.163.com" #smtp会话过程中的mailfrom地址 from_addr="asfgysg@zxsdf.com" #smtp会话过程中的rcptto地址 to_addr="zhaoweikid@163.com" #信件内容 msg="testmail"
svr=smtplib.SMTP(mailserver) #设置为调试模式,就是在会话过程中会有输出信息 svr.set_debuglevel(1) #helo命令,docmd方法包括了获取对方服务器返回信息 svr.docmd("HELOserver") #mailfrom,发送邮件发送者 svr.docmd("MAILFROM:<%s>"%from_addr) #rcptto,邮件接收者 svr.docmd("RCPTTO:<%s>"%to_addr) #data命令,开始发送数据 svr.docmd("DATA") #发送正文数据 svr.send(msg) #比如以.作为正文发送结束的标记,用send发送的,所以要用getreply获取返回信息 svr.send(".") svr.getreply() #发送结束,退出 svr.quit()