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

use*_*523 13 python sockets gmail smtp

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

发布了许多类似问题的案例,但他们没有得到正确答案.例如: 在Python中实现传输层安全性 - 简单邮件客户端

该程序需要连接到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.'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用SSL:

    clientSocketSSL = ssl.wrap_socket(clientSocket)
    
    Run Code Online (Sandbox Code Playgroud)

    然后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.
Run Code Online (Sandbox Code Playgroud)

使用SSL时,我与链接的帖子相同:

ssl.SSLError: [Errno 1] _ssl.c:504: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?我想我最好的选择是使用TLS,但我不知道如何去做...我的MAIL FROM命令有问题吗?

Ale*_*amo 9

使用SSL时,您需要连接到端口465而不是端口587.如果您使用STARTTLS,您仍需要使用ssl.wrap_socket,您只需稍后再执行 - 特别是在收到命令220响应后STARTTLS.在做完之后STARTTLS,你应该再做HELO一次,因为服务器应该忘记之前发生的任何事情STARTTLS.

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

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