通过Python访问Gmail SMTP-AUTH问题



我目前正在为一项任务写这篇文章,但几年前我也遇到了同样的问题,所以放弃了。进一步的搜索让我尝试了各种各样的东西,但我无法通过登录部分。

from socket import *
from ssl import *

msg = "rn I love computer networks!"
endmsg = "rn.rn"
clientSocket = socket(AF_INET, SOCK_STREAM)
mailserver = getaddrinfo('smtp.gmail.com',465, AF_INET, SOCK_STREAM, IPPROTO_TCP)[0][4]
clientSocket = wrap_socket(clientSocket)
clientSocket.connect(mailserver)
recv = clientSocket.recv(1024)
print recv
if recv[:3] != '220':
    print '220 reply not received from server.'
clientSocket.send('EHLO Nolanrn')
recv = clientSocket.recv(1024)
print recv
if recv1[:3] != '250':
    print '250 reply not received from server.'
clientSocket.send('AUTH LOGIN ' + 'my Google email'.encode('base64','strict'))
recv = clientSocket.recv(1024)
print recv
print recv.split()[1].decode('base64')
clientSocket.send("my password".encode('base64','strict'))
recv = clientSocket.recv(1024)
print recv
# And onto other tasks

当我开始使用SSL连接时,我觉得我不需要STARTTLS。如果我把AUTH LOGIN改成AUTH PLAIN,它不知道如何解码。如果我使用PLAIN但不编码,我的程序就会挂起。如果我用"\n\r"(未编码(终止它,我会得到一个坏管道。使用上面的代码,我得到了密码请求。

然后发送我获得的密码535-5.7.8 Username and Password not excepted.这与我登录时使用的密码相同?!?我已经设置了我的帐户以允许不太安全的设备。两步验证。。。开始的过程似乎是针对手机,而不是我的python应用程序。

我已经更改了EHLO以使用我的IP,因为我相信RFC 5321说它应该是这样的。没关系。

我看过RFC 4954…

我挖了smtplib来揭开"AUTH PLAIN " + encode_base64("%s%s" % (user,pass),eol='')只是挂着。。。正在等待。。。

我不知道。

更新

我更改了smtplib以输出提交的每个字符串。这让我更加困惑:

ehlo [127.0.1.1]
AUTH PLAIN [almost forgot one can decode this base64]==
mail FROM:<[gmail account]>
rcpt TO:<[hotmail account]>
data
quit

我的AUTH字符串完全相同,但它挂起了。我在我的hotmail帐户上收到了电子邮件(使用smtplib,而不是我的代码(。

如果你想要一个基本的、非SSL的Gmail连接,你可以使用这个:

import smtplib
gmail = smtplib.SMTP("smtp.gmail.com",587)
gmail.ehlo() #open the connection
gmail.starttls()
gmail.login("gmaillogin","gmailpassword") #login*
gmail.quit() #close the connection

*注意:你需要从你的谷歌账户生成一个gmail应用程序密码。

编辑:如果你想使用SSL加密,请使用这个(感谢furas(:

import smtplib
gmail = smtp.SMTP_SSL("smtp.gmail.com",465)
gmail.ehlo()
gmail.login("gmaillogin","gmailpassword")
gmail.quit()

正如我通常的时尚,这是简单的事情。我只是花了几个小时浏览了一个程序,在谷歌上搜索,却突然出现了一个错误:我定义中的参数顺序不是我在代码中使用它的方式。

在这里。。。我更改了代码以使用AUTH PLAIN,问题。。。我一直在输入'nr',而不是'rn'(如果我用任何东西结束命令,只是省略了,因为'nr'在某些命令上产生了错误,而在其他命令上通过了OK(。感谢您在您喜爱的流媒体视频网站上学习古典音乐。它短暂地提高了我的智力

clientSocket.send('AUTH PLAIN ' + encode_base64("%s%s" % ([email],[password]), eol="") + 'rn')

最新更新