web-dev-qa-db-ja.com

pythonおよびimaplibを使用したGmailログイン失敗

Gmailアカウントにログインして、pythonスクリプトを使用してメールをダウンロードします。見つかったアプローチを調整しようとしています here ですが、私はmステップ1で問題が発生し、imapを介してアカウントにアクセスします。

ここに私が始めているコードがあります:

import email
import imaplib

m = imaplib.IMAP4_SSL("imap.gmail.com",993)
rc, resp = m.login('myemailaddress','mypassword')

次のエラーが表示されます。

Traceback (most recent call last):
  File "email.py", line 1, in <module>
    import email, imaplib
  File "/home/will/wd/email.py", line 14, in <module>
     m.login('myemailaddress','mypassword')
  File "/usr/lib/python3.4/imaplib.py", line 538, in login
    raise self.error(dat[-1])
 imaplib.error: b'[ALERT] Please log in via your web browser: http://support.google.com/mail/accounts/bin/answer.py?answer=78754 (Failure)'

Imapは、Gmailの設定で実際に有効になっています。 herehere などの同様の状況で、Googleサポートリンクの指示とこのエラーに関する質問を見ましたが、私の状況は最初の状況とは異なります。
1)最初はうまくいきませんでした。
2)ブロックされるほど頻繁に実行していません。また、これは通常のGmailアカウントであり、Google Appsアカウントを持つカスタムドメインではないため、2番目の例とは異なります。
https://accounts.google.com/DisplayUnlockCaptcha を使用してアクセスを許可しようとしても機能しません。

ログインを許可する唯一の方法は、Googleアカウントのセキュリティ設定を「安全性の低いアプリへのアクセスを許可する」に変更することです。

私の質問は、アカウントのセキュリティ設定を緩和せずにログインできるようにコード(またはより一般的にはセットアップ)を修正するにはどうすればよいですか? libimapを使用してセキュリティ要件を満たす方法はありますか?

21
whopper510

アカウントのセキュリティを損なうことなくこのエラーを回避したい場合は、OAuth=を使用して認証してください。プロトコルは文書化されています here 、および imaplibでのXOAUTH2の使用を示すPythonサンプルコード があります。

これとは別に、アカウントの 2段階認証 を有効にして、セキュリティを強化することを検討する必要があります。その場合、 App Password を使用してIMAPに接続できます。これにより、上記の警告が回避される場合もあります。

13
Jamie Nicolson

これを有効にしようとすることができます: https://www.google.com/settings/security/lesssecureapps このアクションは同じ問題を解決しました。

17
Alex Ols

新しいGmailの更新により、新しいGmailのセキュリティ設定により、一部のメールサーバーまたはアプリがブロックされます。これを解決するために、私は https://www.google.com/settings/security ページにアクセスし、安全性の低いアプリの「有効な」アクセスにアクセスしました。

3
Raul Cavazos

これを解決するには、テキストモードブラウザ(elinks)を使用して、リモートサーバーからのログインを確認しました。私はすでにしばらく苦労していたので、安全でないアプリや他のさまざまな呪文を有効にすることを試みました。

Emailでgmail.comにログインした後(htmlのみのインターフェイスを使用し、携帯電話にセキュリティコードを送信します)、imaplibを使用してgmailアカウントにアクセスできます。おそらく、Python/imaplibを使用しようとする同じIPからWeb認証を行う必要があります。

OAuthプロトコルを使用する方がおそらくベター™ですが、この方法でスクリプトを書き直さずに再度実行することができました。

0
Åsmund