使用Python连接到SMTP(SSL或TLS)

时间:2012-10-12 07:53:33

标签: python sockets smtp gmail

我正在尝试连接到Gmail SMTP邮件服务器并按照给我的框架代码所述执行任务。仅允许使用socket s(因此不允许使用smtplib)。我需要:发送HELO命令,MAIL FROMRCPT TODATA

发布了许多类似问题,但他们没有得到正确答案。例如: Implementing Transport Layer Security in Python - Simple Mail Client

该程序需要通过端口smtp.gmail.com连接到587。我采取了两种不同的方法:

  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添加到顶部。

  3. 使用第一种方法时,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命令有问题吗?

2 个答案:

答案 0 :(得分:9)

使用SSL时,您需要连接到端口465而不是端口587.如果您使用STARTTLS,仍然需要使用ssl.wrap_socket,您只需稍后再执行 - 具体来说,在收到{{1}后响应220命令。执行STARTTLS后,您应该再次执行STARTTLS,因为服务器应该忘记HELO之前发生的任何事情。

在任何一种情况下,smtp.google.com端口465和587上的服务器仍然不会返回对STARTTLS命令的250响应,因为它们要求您在发送之前进行身份验证邮件。您将获得MAIL响应。您需要使用530命令和gmail.com凭据进行身份验证,然后才能在这些服务器上成功使用AUTH

如果您不想进行身份验证,并且根据您需要执行的操作的详细信息,您可以尝试使用gmail.com的MX记录中找到的服务器的端口25。目前,服务器是gmail-smtp-in.l.google.com并支持STARTTLS。

答案 1 :(得分:0)

STARTTLS之后,致电

clientSocket = ssl.wrap_socket(clientSocket)