600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > python smtplib模块发送SSL/TLS安全邮件实例

python smtplib模块发送SSL/TLS安全邮件实例

时间:2022-05-12 13:22:25

相关推荐

python smtplib模块发送SSL/TLS安全邮件实例

后端开发|Python教程

python,smtplib,SSL,TLS

后端开发-Python教程

python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。

黑月界面例子源码,查看软件ubuntu,tomcat安装配置jdk,动态输入爬虫,php单点登录视频教程,珠海百度seo推广哪家好lzw

smtp协议的基本命令包括:

软件 网页下载 源码,树莓派ubuntu 64,如何制作爬虫饲料,长海PHP培训,酷网seo教程lzw

HELO 向服务器标识用户身份

MAIL 初始化邮件传输 mail from:

RCPT 标识单个的邮件接收人;常在MAIL命令后面,可有多个rcpt to:

DATA 在单个或多个RCPT命令后,表示所有的邮件接收人已标识,并初始化数据传输,以.结束

VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令

EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用

HELP 查询服务器支持什么命令

NOOP 无操作,服务器应响应OK

QUIT 结束会话

RSET 重置会话,当前传输被取消

MAIL FROM 指定发送者地址

RCPT TO 指明的接收者地址

仿招聘app源码,ubuntu 账户控制,域名与tomcat部署项目,爬虫扒json,.php .html,广州seo广告费多少钱lzw

一般smtp会话有两种方式,一种是邮件直接投递,就是说,比如你要发邮件給zzz@,那就直接连接的邮件服务器,把信投給zzz@; 另一种是验证过后的发信,它的过程是,比如你要发邮件給zzz@,你不是直接投到,而是通过自己在的另一个邮箱来发。这样就要先连接的smtp服务器,然后认证,之后在把要发到的信件投到上,会帮你把信投递到。

第一种方式的命令流程基本是这样:

1. helo

2. mail from

3. rcpt to

4. data

5. quit

但是第一种发送方式一般有限制的,就是rcpt to指定的这个邮件接收者必须在这个服务器上存在,否则是不会接收的。 先看看代码:

代码如下:

#-*- encoding: gb2312 -*-import os, sys, stringimport smtplib# 邮件服务器地址mailserver = ""# smtp会话过程中的mail from地址from_addr = "asfgysg@"# smtp会话过程中的rcpt to地址to_addr = "zhaoweikid@"# 信件内容msg = "test mail"svr = smtplib.SMTP(mailserver)# 设置为调试模式,就是在会话过程中会有输出信息svr.set_debuglevel(1)# helo命令,docmd方法包括了获取对方服务器返回信息svr.docmd("HELO server")# mail from, 发送邮件发送者svr.docmd("MAIL FROM:

注意的是,是有反垃圾邮件功能的,想上面的这种投递邮件的方法不一定能通过反垃圾邮件系统的检测的。所以一般不推荐个人这样发送。

第二种有点不一样:

1.ehlo

2.auth login

3.mail from

4.rcpt to

5.data

6.quit

相对于第一种来说,多了一个认证过程,就是auth login这个过程。

代码如下:

#-*- encoding: gb2312 -*-import os, sys, stringimport smtplibimport base64# 邮件服务器地址mailserver = ""# 邮件用户名username = "xxxxxx@"# 密码password = "xxxxxxx"# smtp会话过程中的mail from地址from_addr = "xxxxxx@"# smtp会话过程中的rcpt to地址to_addr = "yyyyyy@"# 信件内容msg = "my test mail"svr = smtplib.SMTP(mailserver)# 设置为调试模式,就是在会话过程中会有输出信息svr.set_debuglevel(1)# ehlo命令,docmd方法包括了获取对方服务器返回信息svr.docmd("EHLO server")# auth login 命令svr.docmd("AUTH LOGIN")# 发送用户名,是base64编码过的,用send发送的,所以要用getreply获取返回信息svr.send(base64.encodestring(username))svr.getreply()# 发送密码svr.send(base64.encodestring(password))svr.getreply()# mail from, 发送邮件发送者svr.docmd("MAIL FROM:

上面说的是最普通的情况,但是不能忽略的是现在好多企业邮件是支持安全邮件的,就是通过SSL发送的邮件,这个怎么发呢?SMTP对SSL安全邮件的支持有两种方案,一种老的是专门开启一个465端口来接收ssl邮件,另一种更新的做法是在标准的25端口的smtp上增加一个starttls的命令来支持。

看看第一种怎么办:

#-*- encoding: gb2312 -*-import os, sys, string, socketimport smtplibclass SMTP_SSL (smtplib.SMTP): def __init__(self, host=\, port=465, local_hostname=None, key=None, cert=None): self.cert = cert self.key = key smtplib.SMTP.__init__(self, host, port, local_hostname) def connect(self, host=localhost, port=465): if not port and (host.find(:) == host.rfind(:)): i = host.rfind(:) if i >= 0:host, port = host[:i], host[i+1:]try: port = int(port)except ValueError: raise socket.error, "nonnumeric port" if not port: port = 654 if self.debuglevel > 0: print>>stderr, connect:, (host, port) msg = "getaddrinfo returns an empty list" self.sock = None for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): af, socktype, proto, canonname, sa = res try:self.sock = socket.socket(af, socktype, proto)if self.debuglevel > 0: print>>stderr, connect:, (host, port)self.sock.connect(sa)# 新增加的创建ssl连接sslobj = socket.ssl(self.sock, self.key, self.cert) except socket.error, msg:if self.debuglevel > 0:print>>stderr, connect fail:, (host, port)if self.sock: self.sock.close()self.sock = Nonecontinue break if not self.sock: raise socket.error, msg # 设置ssl self.sock = smtplib.SSLFakeSocket(self.sock, sslobj) self.file = smtplib.SSLFakeFile(sslobj); (code, msg) = self.getreply() if self.debuglevel > 0: print>>stderr, "connect:", msg return (code, msg) if __name__ == \__main__: smtp = SMTP_SSL(192.168.2.10) smtp.set_debuglevel(1) smtp.sendmail("zzz@", "zhaowei@", "xxxxxxxxxxxxxxxxx") smtp.quit()

这里我是从原来的smtplib.SMTP派生出了新的SMTP_SSL类,它专门来处理ssl连接。我这里测试的192.168.2.10是我自己的测试服务器.

第二种是新增加了starttls的命令,这个很简单,smtplib里就有这个方法,叫smtplib.starttls()。当然,不是所有的邮件系统都支持安全邮件的,这个需要从ehlo的返回值里来确认,如果里面有starttls,才表示支持。相对于发送普通邮件的第二种方法来说,只需要新增加一行代码就可以了:

#-*- encoding: gb2312 -*-import os, sys, stringimport smtplibimport base64# 邮件服务器地址mailserver = ""# 邮件用户名username = "xxxxxx@"# 密码password = "xxxxxxx"# smtp会话过程中的mail from地址from_addr = "xxxxxx@"# smtp会话过程中的rcpt to地址to_addr = "yyyyyy@"# 信件内容msg = "my test mail"svr = smtplib.SMTP(mailserver)# 设置为调试模式,就是在会话过程中会有输出信息svr.set_debuglevel(1)# ehlo命令,docmd方法包括了获取对方服务器返回信息,如果支持安全邮件,返回值里会有starttls提示svr.docmd("EHLO server")svr.starttls() # <------ 这行就是新加的支持安全邮件的代码!# auth login 命令svr.docmd("AUTH LOGIN")# 发送用户名,是base64编码过的,用send发送的,所以要用getreply获取返回信息svr.send(base64.encodestring(username))svr.getreply()# 发送密码svr.send(base64.encodestring(password))svr.getreply()# mail from, 发送邮件发送者svr.docmd("MAIL FROM:

注意: 以上的代码为了方便我都没有判断返回值,严格说来,是应该判断一下返回的代码的,在smtp协议中,只有返回代码是2xx或者3xx才能继续下一步,返回4xx或5xx的,都是出错了。

【相关推荐】

1. 详细介绍Python使用SMTP发送邮件实例

2. Python 使用SMTP发送邮件的代码小结

3. c#调用qq邮箱smtp发送邮件修改版代码

4. Python使用SMTP发送邮件

5. php smtp发送邮件

6. Python SMTP邮件模块详解

7. 分享Python实现SMTP发送邮件图文实例

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。