2012-10-12 22 views
12

我試圖連接到Gmail SMTP郵件服務器並按照給出的框架代碼執行任務。只允許使用socket s(所以不能使用smtplib)。我需要:發送HELO命令,MAIL FROM,RCPT TODATA使用Python連接到SMTP(SSL或TLS)使用Python

有很多類似的問題發佈,但他們還沒有得到正確的答案。例如: Implementing Transport Layer Security in Python - Simple Mail Client

該程序需要通過端口587連接到smtp.gmail.com。我已經採取了兩種不同的方法:

  1. 使用STARTTLS:

    mailserver = 'smtp.gmail.com' 
    clientSocket = socket(AF_INET, SOCK_STREAM) 
    clientSocket.connect((mailserver, 587)) 
    recv = clientSocket.recv(1024) 
    print recv 
    if recv[:3] != '220': 
        print '220 reply not received from server.' 
    
    #Send HELO command and print server response 
    heloCommand = 'HELO Alice\r\n' 
    clientSocket.send(heloCommand) 
    recv1 = clientSocket.recv(1024) 
    print recv1 
    if recv1[:3] != '250': 
        print '250 reply not received from server.' 
    
    #Send MAIL FROM command and print server response. 
    command = "STARTTLS\r\n" 
    clientSocket.send(command) 
    recvdiscard = clientSocket.recv(1024) 
    print recvdiscard 
    clientSocket.send("MAIL From: email\r\n") 
    recv2 = clientSocket.recv(1024) 
    print recv2 
    if recv2[:3] != '250': 
        print '250 reply not received from server.' 
    
  2. 使用SSL:

    clientSocketSSL = ssl.wrap_socket(clientSocket) 
    

    然後clientSocketSSL取代的clientSocket所有實例。 STARTTLS行也被刪除,import ssl被添加到頂部。

當使用第一種方法時,MAIL FROM:命令沒有返回任何內容。我得到以下輸出:

250 mx.google.com at your service 

220 2.0.0 Ready to start TLS 

250 reply not received from server. 

使用SSL時,我得到了相同鏈接的帖子:

ssl.SSLError: [Errno 1] _ssl.c:504: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol 

我失去了一些東西在這裏?我想我最好的選擇是使用TLS,但我不知道如何去做...我的MAIL FROM命令有什麼問題嗎?

+0

你試過了嗎? [發送具有蟒電子郵件] [1] [1]:HTTP://計算器。com/a/399240/986760 – fayyazkl

+0

@fayyazkl正如我所說我只能使用套接字,而不是smtplib – user1287523

+0

首先在代碼中修改縮進。 –

回答

9

使用SSL時,您需要連接到端口465,而不是端口587如果您使用STARTTLS,你仍然需要使用ssl.wrap_socket,你只是做了以後 - 具體而言,在接收到220應對STARTTLS命令後。在做了STARTTLS之後,你應該再次執行HELO,因爲服務器應該會忘記在STARTTLS之前發生的任何事情。

在這兩種情況下,服務器在smtp.google.com端口465和587仍然不會返回250應對MAIL命令,因爲它們需要你發送郵件之前先進行身份驗證。您將得到一個530響應。您需要使用帶有gmail.com憑據的AUTH命令進行身份驗證,然後才能在這些服務器上成功使用MAIL

如果您不想進行身份驗證,並根據您需要執行的操作的詳細信息,可以嘗試使用gmail.com MX記錄中找到的服務器的端口25。目前,服務器是gmail-smtp-in.l.google.com並支持STARTTLS。