GMail在Python中包装套接字时惊动了错误的版本号

GMail在Python中包装套接字时惊动了错误的版本号,python,sockets,gmail,Python,Sockets,Gmail,我正在尝试使用Python3中的套接字连接到Gmail的SMTP。使用此代码(省略响应接收部分): 但是我在do\u握手中遇到了以下错误 最后一行: ssl.SSLError:[ssl:error\u VERSION\u NUMBER]error VERSION NUMBER(\u ssl.c:645) 在最后一行中,我还尝试了以下版本: ssl_version=ssl.PROTOCOL_SSLv23 ssl.PROTOCOL_TLSv1 ssl.

我正在尝试使用Python3中的套接字连接到Gmail的SMTP。使用此代码(省略响应接收部分):

但是我在
do\u握手中遇到了以下错误
最后一行:

ssl.SSLError:[ssl:error\u VERSION\u NUMBER]error VERSION NUMBER(\u ssl.c:645)

在最后一行中,我还尝试了以下版本:

ssl_version=ssl.PROTOCOL_SSLv23
            ssl.PROTOCOL_TLSv1
            ssl.OP_NO_SSLv3
            ssl.OP_NO_TLSv1
            ssl.PROTOCOL_SSLv2
            ssl.PROTOCOL_SSLv23
            ssl.PROTOCOL_SSLv3
            ssl.PROTOCOL_TLSv1

我做错什么了吗?谢谢。

问题是你的插座上从来没有收到过信号。你也许可以在一些服务器上逃脱(我怀疑),但谷歌的服务器不喜欢它。真的不认为它会与任何服务器一起工作,因为我非常确定您需要一个干净的接收缓冲区,这样TLS协商就可以在没有一堆之前的垃圾还在管道中的情况下进行

您的代码正在为我进行以下更改:

import ssl
import base64
from socket import *

cs = socket(AF_INET, SOCK_STREAM)
cs.connect(("smtp.gmail.com", 587))
print(cs.recv(4096))
cs.send(b'EHLO smtp.google.com\r\n')
print(cs.recv(4096))
cs.send(b'STARTTLS\r\n')
print(cs.recv(4096))
ws = ssl.wrap_socket(cs, ssl_version=ssl.PROTOCOL_TLSv1)
ws.send(b'MAIL FROM: abc@def.com\r\n')
print(ws.recv(4096))

但是正如评论中已经提到的,除非这只是为了好玩和/或学习,否则您应该使用python的smtplib。

您没有正确处理STARTTLS连接。在中为SMTP指定了执行此操作的方法。您应该使用可以处理STARTTLS的smtp库。幸运的是python的模块做到了这一点。@JamesKPolk这次我将更好地阅读RFC。是的,我以前使用过smtp库,但是我需要在这个实验中使用套接字。谢谢。@JamesKPolk我相信这段代码中唯一错误的部分是最后一行,我试图在那里创建一个SSL套接字。你能帮我吗?有趣的是,它确实管用,但事后可能会失败。有可能我的TLS协议与Gmail协议不同吗?不确定以后失败意味着什么。你需要更具体一点。Gmail将要求您在它有任何工作机会之前进行适当的身份验证。
import ssl
import base64
from socket import *

cs = socket(AF_INET, SOCK_STREAM)
cs.connect(("smtp.gmail.com", 587))
print(cs.recv(4096))
cs.send(b'EHLO smtp.google.com\r\n')
print(cs.recv(4096))
cs.send(b'STARTTLS\r\n')
print(cs.recv(4096))
ws = ssl.wrap_socket(cs, ssl_version=ssl.PROTOCOL_TLSv1)
ws.send(b'MAIL FROM: abc@def.com\r\n')
print(ws.recv(4096))