2012-09-26 96 views
1

到目前为止,我的代码如下:如何连接在Python通过SSL套接字的Gmail

from socket import * 
import ssl 
msg = "\r\n smtp..." 
endmsg = "\r\n.\r\n" 

# Choose a mail server (e.g. Google mail server) and call it mailserver 
mailserver = ("smtp.gmail.com", 587) 

# Create socket called clientSocket and establish a TCP connection with mailserver over SSL 
clientSocket = socket(AF_INET, SOCK_STREAM); 
clientSocket = ssl.wrap_socket(clientSocket, ssl_version=ssl.PROTOCOL_SSLv23) 
clientSocket.connect(mailserver) 

#Print server response 
recv = clientSocket.recv(1024) 
print recv 
if recv[:3] != '220': 
print '220 reply not received from server.' 

我得到错误信息ssl.SSLERrror:[错误1] _ssl.c:504:错误: 140770FC:SSL例程:SSL23_GET_SERVER_HELLO:尝试运行此脚本时的未知协议。在其他时间,我已经得到关于服务器没有及时响应的错误。

有没有人有任何线索我做错了什么? (是的,我知道我可以使用smtplib处理smtp服务器,但这是一个练习)

回答

2

端口587未加密。

telnet smtp.gmail.com 587 

Trying 74.125.142.109... 
Connected to gmail-smtp-msa.l.google.com. 
Escape character is '^]'. 
220 mx.google.com ESMTP aa4sm9457625igc.15 
helo test.com 
250 mx.google.com at your service 
+0

啊。 但是,当我做AUTH LOGIN并提供我所有的凭据并且准备好做MAIL FROM命令时,我是否需要启用TLS或者不关心smtp服务器? – ripit

+0

@EthanWillis:在进行初始连接之后,您需要让服务器切换到TLS(使用'STARTTLS'命令)。 Gmail的服务器*不关心,不会让您在没有加密连接的情况下发送电子邮件。 –

+0

@GregHewgill我已经尝试用telnet手动执行此操作,但在发出STARTTLS后,我不确定如何“协商”TLS连接,以便我可以发出AUTH LOGIN命令。也许我应该创造一个新的问题? – ripit