2017-11-25 9 views
2

受信トレイを読み込んで添付ファイルを処理するコードを記述しようとしています。私はこれが、特定のテーマを持つすべてのメッセージを処理したいときに発電機がどのように動作するかを知る良い機会になると判断しました。私はすべての添付ファイルとの関連科目を取得することができますポイントに得ているが、私は一種の私はメールを生成してメッセージを処理するジェネレータを作成する

def read_email_from_gmail(): 
    try: 
     print 'got here' 
     mail = imaplib.IMAP4_SSL(SMTP_SERVER) 
     mail.login(FROM_EMAIL,FROM_PWD) 
     mail.select('inbox') 

     type, data = mail.search(None, 'ALL') 
     mail_ids = data[0] 

     id_list = mail_ids.split() 
     first_email_id = int(id_list[0]) 
     latest_email_id = int(id_list[-1]) 
     print latest_email_id 


     while True: 
      for i in range(latest_email_id,first_email_id - 1, -1): 
       latest_email_id -= 1 
       #do stuff to get attachment and subject 
       yield attachment_data, subject 


    except Exception, e: 
     print str(e) 

for attachment, subject in read_email_from_gmail(): 
    x = process_attachment(attachment) 
    y = process_subject(subject) 

がされたループにlatest_email_idを進めています進めていなかったfor i in range . . .でイテレータとして偽のそれに持っていましたインボックスに状態を保持するためにジェネレータを使用して私のインボックスを進めるためには、もっとpythonicな方法がありますか?

+0

コードを[e-satis '](https://stackoverflow.com/a/642988/190597)と比較したい場合があります。彼は、 'for i in range(...) 'ループなしでメッセージを反復処理する別の方法を示しています。 – unutbu

+0

私はそのアプローチから始めて、ジェネレータについて疑問を抱かせたので、コードをよりよくカプセル化することができました。それぞれのメールメッセージに加えなければならないことは、非常に広範で、ジェネレータ – PyNEwbie

答えて

0

私はジェネレータについてもう少し学び、始めたコードで遊んだので、ジェネレータを使用して関連する電子メールメッセージをメイン関数の対象にする機能があります。私がアクセスしていますがこれは私がこれまで持っているものであり、一つ一つ自分のメッセージにアクセスするには

import imaplib 
import email 
FROM_EMAIL = '[email protected]' 
FROM_PWD = "mygmail_password" 
SMTP_SERVER = "imap.gmail.com" 
SMTP_PORT = 993 
STOP_MESSAGES = set(['Could not connect to mailbox', 
        'No Messages or None Retrieved Successfully', 
        'Could not retrieve some message', 
        'Finished processing']) 

def read_emails(): 
    mail = imaplib.IMAP4_SSL(SMTP_SERVER) 
    mail.login(FROM_EMAIL,FROM_PWD) 
    mail.select('inbox') 
    con_status, data = mail.uid('search', None, "ALL") 
    if con_status != 'OK': 
     yield 'Could not connect to mailbox' 
    try: 
     mail_ids = data[0].split() 
    except Exception: 
     yield 'No Messages or None Retrieved Successfully' 
    print mail_ids 

    processed = [] 
    while True: 
     for mail_id in mail_ids: 
      status, mdata = mail.uid('fetch', mail_id, '(RFC822)') 
      if status != 'OK': 
       yield 'Could not retrieve some message' 
      if mail_id in processed: 
       yield 'Finished processing' 
      raw_msg = mdata[0][1] 
      structured_msg = email.message_from_string(raw_msg) 
      msg_subject = structured_msg['subject'] 
      processed.append(mail_id) 
      yield msg_subject 

私のニーズのために素晴らしい作品、私はその後

for msg_subj in read_emails(): 
    if msg_subj not in STOP_MESSAGES: 
     do some stuff here with msg_subj 
    else: 
     print msg_subj 
     break 

私のメッセージを取得するには、次のブロックを使用しますこれらのメッセージはuidで削除されますので、削除管理の鍵としてuidを使用します。私にとっては、uidという名前のリストをprocessedという名前で収集し、すでに処理されていたuidで作業していたため、再びそのサークルに通すかどうかを確認することでした。

関連する問題