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