通过Python访问Gmail SMTP - AUTH问题

时间:2016-10-25 09:31:14

标签: python email smtp

我现在写这个作为作业,但多年前我遇到了同样的问题而且放弃了。进一步搜索让我尝试了各种各样的东西,我无法通过登录部分。

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,而不是我的代码)。

2 个答案:

答案 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')