2016-10-25 14 views
0

私は現在この課題を書いていますが、何年も前に私は同じ問題を抱えていました。さらに検索すると、さまざまなことを試してもらえましたが、ログイン部分を過ぎることはできません。Python経由でGmail SMTPにアクセスする - 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 

私はSSLとの接続を開始すると、私はSTARTTLSを必要としない印象の下です。 AUTH LOGINAUTH PLAINに変更すると、デコード方法がわかりません。 PLAINを使用してもエンコードしないと、プログラムがハングするだけです。私が "\ n \ r"(エンコードされていない)で終了すると、パイプが壊れてしまいます。上記のコードを使用して、私はパスワード要求を得る。

次にパスワードを送信します。535-5.7.8 Username and Password not excepted.私は同じパスワードを使用していますか?!?安全性の低いデバイスを許可するようにアカウントを設定しました。 2段階認証プロセスが開始されました。私のpythonアプリケーションではなく、携帯電話向けのプロセスが開始されたようです。

私はRFC5321がそうであるべきだと思うので、私はEHLOに自分のIPを使用するように変更しました。関係ない。私はRFC 4954を通じて見てきた

...

私は見当もつかない"AUTH PLAIN " + encode_base64("\0%s\0%s" % (user,pass),eol='')だけでハングアップします...待って...

を明らかにsmtplibに掘りました。

アップデートは私が提出したすべての文字列を出力する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文字列はまったく同じですが、それがハングアップします。そして私は私のホットメールアカウント(smtplibを使用して、私のコードではない)で電子メールを受け取ります。

答えて

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

あなたは 'SMTP_SSL()'、ポート '465'を必要とし、まあそこ' STARTTLS() ' – furas

+0

@furasせず屋に行きます。情報ありがとう –

+0

ありがとうございます。 :) Unfort私はタスクを目的としたライブラリを使用して課題を回避しているので、私はそれを使用できません...しかし、それは機能します(サイレントに終了します)。私がやっていないことを理解する。 –

0

一般的に私のファッションであるとして、それはシンプルなものです。私はちょうど1つのプログラムを見渡す時間を費やし、私に1つのエラーが出るようにすることを求めました。私の定義におけるパラメータの順序は、私のコードでどのように使われたのかではありませんでした。

ここ

...私は'\n\r'は、いくつかのコマンドのエラーを生成して行ってきましたので、唯一の省略、何もしてコマンドを終了していた場合、私は(ない'\r\n''\n\r'に入れていた... AUTH PLAINを使用するように私のコードを変更し、問題他の人は大丈夫です)。お気に入りのストリーミングビデオサイトでクラシック音楽を勉強していただきありがとうございます。それは私の知性を簡単に上げました。 SSLのため:)

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