2012-09-26 123 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