我正在尝试连接到Gmail SMTP邮件服务器并按照给我的框架代码所述执行任务。仅允许使用socket
s(因此不允许使用smtplib
)。我需要:发送HELO
命令,MAIL FROM
,RCPT TO
和DATA
。
发布了许多类似问题,但他们没有得到正确答案。例如: Implementing Transport Layer Security in Python - Simple Mail Client
该程序需要通过端口smtp.gmail.com
连接到587
。我采取了两种不同的方法:
使用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.'
使用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 :(得分: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)