重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
smtp协议的基本命令包括:
HELO 向服务器标识用户身份
MAIL 初始化邮件传输 mail from:
RCPT 标识单个的邮件接收人;常在MAIL命令后面,可有多个rcpt to:
DATA 在单个或多个RCPT命令后,表示所有的邮件接收人已标识,并初始化数据传输,以.结束
VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
HELP 查询服务器支持什么命令
NOOP 无操作,服务器应响应OK
QUIT 结束会话
RSET 重置会话,当前传输被取消
MAIL FROM 指定发送者地址
RCPT TO 指明的接收者地址
一般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. mail from
3. rcpt to
4. data
5. quit
但是第一种发送方式一般有限制的,就是rcpt to指定的这个邮件接收者必须在这个服务器上存在,否则是不会接收的。 先看看代码:
#-*- encoding: gb2312 -*- import os, sys, string import smtplib # 邮件服务器地址 mailserver = "smtp.163.com" # smtp会话过程中的mail from地址 from_addr = "asfgysg@zxsdf.com" # smtp会话过程中的rcpt to地址 to_addr = "zhaoweikid@163.com" # 信件内容 msg = "test mail" svr = smtplib.SMTP(mailserver) # 设置为调试模式,就是在会话过程中会有输出信息 svr.set_debuglevel(1) # helo命令,docmd方法包括了获取对方服务器返回信息 svr.docmd("HELO server") # mail from, 发送邮件发送者 svr.docmd("MAIL FROM: <%s>" % from_addr) # rcpt to, 邮件接收者 svr.docmd("RCPT TO: <%s>" % to_addr) # data命令,开始发送数据 svr.docmd("DATA") # 发送正文数据 svr.send(msg) # 比如以 . 作为正文发送结束的标记,用send发送的,所以要用getreply获取返回信息 svr.send(" . ") svr.getreply() # 发送结束,退出 svr.quit()
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。