3

オンラインで見つけたコードと自分で編集したコードを組み合わせて、Gmailから添付ファイルをダウンロードしようとしています。ただし、次のコード:

import email, getpass, imaplib, os, random, time
import oauth2 as oauth
import oauth2.clients.imap as imaplib

MY_EMAIL = 'example@gmail.com'
MY_TOKEN = "token"
MY_SECRET = "secret"

consumer = oauth.Consumer('anonymous', 'anonymous')
token = oauth.Token(MY_TOKEN, MY_SECRET)

url = "https://mail.google.com/mail/b/"+MY_EMAIL+"/imap/"
m = imaplib.IMAP4_SSL('imap.gmail.com')

m.authenticate(url, consumer, token)

m.select('INBOX')

items = m.select("UNSEEN"); 
items = items[0].split() 

for emailid in items:
    data = m.fetch(emailid, "(RFC822)")

このエラーを返します:

imaplib.error:状態AUTHでコマンドFETCHが無効です

許可されているのになぜフェッチが違法になるのですか?

4

2 に答える 2

3

選択する呼び出しのエラーチェックが不足しています。通常、これは、メールボックスへの接続の最初の部分を構成する方法です。

# self.conn is an instance of IMAP4 connected to my server.
status, msgs = self.conn.select('INBOX')

if status != 'OK':
  return # could be break, or continue, depending on surrounding code.

msgs = int(msgs[0])

基本的に、発生している問題は、存在しないメールボックスを選択したこと、ステータスメッセージが本来の「OK」ではないこと、繰り返し処理している値が無効であることです。selectはメールボックス名を期待していることを忘れないでください。フラグ(「UNSEEN」で試行している可能性があります)に基づいて検索することはありません。存在しないメールボックスを選択すると、実際にはこれが応答として返されます。

('NO', ['The requested item could not be found.'])

その場合、for email id in itemsは正常に動作していません。残念ながら、あなたが何を求めているのかではありません。有効なメールボックスで取得するものは次のようになります。

('OK', ['337'])

お役に立てば幸いです。

コメントの質問に対処するには、メールボックス内の未表示のメッセージを実際に取得する場合は、次を使用します。

status, msgs = self.conn.select('INBOX')
# returns ('OK', ['336'])

status, ids = self.conn.search(None, 'UNSEEN')
# returns ('OK', ['324 325 326 336'])

if status == 'OK':
  ids = map(int, ids[0].split())

応答はselectからの応答と似ていますが、メッセージ数の単一の整数の代わりに、IDのリストを取得します。

于 2011-03-04T22:48:01.307 に答える
3

許可されているのになぜフェッチが違法になるのですか?

IMAPには状態の概念があります。

フォルダを選択した場合にのみメッセージを取得できます。

これを示す素敵な写真があります:

IMAPの状態

画像ソース:http ://www.tcpipguide.com/free/t_IMAP4GeneralOperationClientServerCommunicationandS-2.htm

于 2015-09-24T10:00:01.837 に答える