2016-10-25 2 views
0

Я пишу это сейчас для задания, но годы назад у меня была такая же проблема, и я просто сдался. Дальнейшие поиски заставили меня попробовать множество вещей, и я не могу пройти мимо части входа.Доступ к Gmail SMTP через Python - проблемы с AUTH

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 

Я нахожусь под впечатлением, мне не нужно STARTTLS как я начала соединения с помощью SSL. Если я изменю 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='') Просто висит ... жду ...

Я не имею ни малейшего понятия.

Update

Я изменил 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

Если вы хотите, основной, не-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 из вашей учетной записи Google.

Edit: Если вы хотите использовать шифрование SSL, используйте это (спасибо furas):

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

для SSL вам нужно 'SMTP_SSL()', порт '465', и без' STARTTLS() ' – furas

+0

@furas Ну там я идти.Спасибо за информацию –

+0

Спасибо. :) Unfort Я не могу использовать его, поскольку обойду назначение, используя библиотеку, предназначенную для этой задачи ... Но она работает (тихо выходит так, как я предполагаю), что просто означает, что я потерпел неудачу и должен пересмотреть библиотеку и выяснить, что я не делаю. –

0

Как правило, моя мода, это простые вещи. Я просто потратил часы, просматривая одну программу, и Googling только для того, чтобы одна ошибка выскочила на меня: порядок параметров в моем определении был не таким, как я использовал его в своем коде.

Вот ... Я изменил мой код, чтобы использовать AUTH PLAIN и вопрос ... Я помещал в '\n\r' не '\r\n' (если я закончил команду с чем угодно, только опущено, поскольку '\n\r' произведенных ошибками на некоторых командах и пошел через хорошо на других). Благодарим вас за классическую музыку для изучения на вашем любимом потоковом видеоролике. Он ненадолго поднял мой интеллект. :)

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