我现在写这个作为作业,但多年前我遇到了同样的问题而且放弃了。进一步搜索让我尝试了各种各样的东西,我无法通过登录部分。
from socket import *
from ssl import *
msg = "\r\n I love computer networks!"
endmsg = "\r\n.\r\n"
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 Nolan\r\n')
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("\0%s\0%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,而不是我的代码)。
答案 0 :(得分:0)
如果您想要与Gmail建立基本的非SSL连接,可以使用以下命令:
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
*注意:您需要从Google帐户生成gmail应用程序密码。
修改强> 如果您想使用SSL加密,请使用此功能(感谢furas):
import smtplib
gmail = smtp.SMTP_SSL("smtp.gmail.com",465)
gmail.ehlo()
gmail.login("gmaillogin","gmailpassword")
gmail.quit()
答案 1 :(得分:0)
通常我的时尚,这是简单的事情。我只花了几个小时查看一个程序,谷歌搜索只是向我弹出一个错误:我的定义中的参数顺序不是我在代码中使用它的方式。
在这里......我改变了我的代码以使用AUTH PLAIN
和问题......我一直在放'\n\r'
而不是'\r\n'
(如果我用任何东西结束了命令,仅因为'\n\r'
在某些命令上产生错误而在其他命令上执行正常而被省略。感谢您在自己喜欢的流媒体视频网站上学习古典音乐。它简短地提升了我的情报。 :)
clientSocket.send('AUTH PLAIN ' + encode_base64("\0%s\0%s" % ([email],[password]), eol="") + '\r\n')