2017-11-25 174 views
2

我嘗試寫一些代碼來閱讀我的收件箱,如果現在處理一些附件。我決定這將是學習生成器如何工作的好時機,因爲我想處理所有具有特定主題的消息。我得到的地步,我可以得到所有的附件和相關科目,但我有點不得不僞造其作爲for i in range . . .迭代器並沒有前進,所以我在循環創建一個發電機來閱讀電子郵件和處理消息

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還有更多的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爲重點,以管理缺失。對我來說,訣竅是收集在一個名爲processed列表中的uid,然後檢查,看看是否我正想再通過他們來圈,因爲我與已經處理的uid工作。