2017-06-29 106 views
3

我一直在做一個Python腳本,因爲在登錄該檢查電子郵件這裏是我到目前爲止的代碼:如何才能讓我的電子郵件只顯示一次每封電子郵件?

#!/usr/bin/python 
import imaplib, getpass 

mail = imaplib.IMAP4_SSL('imap.gmail.com') 
u = raw_input('Your Gmail Address: ') 
p = getpass.getpass() 
mail.login(u, p) 
mail.select("inbox") 

while 1: 
     r, data = mail.search(None, "ALL") 
     ids = data[0] 
     id_list = ids.split() 
     latest_email_id = id_list[-1] 
     r, data = mail.fetch(latest_email_id, "(RFC822)") 
     raw_email = data[0][1] 
     print raw_email 

的問題是,它一直顯示相同的電子郵件一遍又一遍(直到一個新的一個被接收)因爲while循環。

我怎樣才能使它:

  1. 只顯示已接收電子郵件的一次,直到接收到新的一個
  2. 只顯示了新的一次
  3. 重複永遠
+2

您需要保存所有您以前顯示的信息的ID。然後瀏覽列表並跳過保存列表中的所有內容。 – Barmar

+0

@Barmar你能解釋一下嗎?我剛接觸'imaplib'。 – keeganjk

+1

這只是基本的Python數據結構。使用'set'來保存你所看到的所有ID。然後在'id_list:'中做'id來遍歷所有的ID,測試它們是否在集合中。如果它不在集合中,則打印電子郵件並將該ID添加到集合中。 – Barmar

回答

0

我已經找到了解決辦法:

list = [] 

while 1: 
     mail.select('inbox') 
     r, data = mail.search(None, "ALL") 
     ids = data[0] 
     id_list = ids.split() 
     latest_email_id = id_list[-1] 
     r, data = mail.fetch(latest_email_id, "(RFC822)") 
     raw_email = data[0][1] 
     if not raw_email in list: 
       print raw_email 
       list.append(raw_email) 

基本上,它創建了一個名爲list列表:

list = [] 

,然後在循環那多半是一樣的,除了在開始的時候,它再次檢查郵箱:

while 1: 
    mail.select('inbox') 

然後,最後,它會printraw_email如果是在listnot,然後將其添加到list,所以它不會被再次print編輯:

if not raw_email in list: 
       print raw_email 
       list.append(raw_email) 
1

所以你基本上想開發一個電子郵件收聽器 ... 在下面的代碼中,我只會下載未看到的電子郵件,以便我們只需要t他有關的數據。然後,一旦郵件被取出,我將其標記爲「已讀」,因此它的ID不會再露面:

while 1: 
     r, search_data = mail.search(None, "UNSEEN") #gets only the unseen emails 
     ids = data[0] 
     id_list = ids.split() 
     latest_email_id = id_list[-1] 
     r, data = mail.fetch(latest_email_id, "(RFC822)") 
     raw_email = data[0][1] 
     print raw_email 
     mail.store(search_data[0].replace(' ',','),'+FLAGS','\Seen') #marks as read 

現在,至少你的代碼不會一次又一次地打印相同的郵件。 IMAP在快速獲取新郵件時比POP3更可靠。不過,這可能需要一些時間。

+0

如果兩次(或更多次)電子郵件在迭代之間到達,該怎麼辦?這將顯示最新的,但跳過其他人。 – Barmar

+0

@Barmar你是對的。但我認爲有一個IMAP函數只返回「未讀」電子郵件。但是,要意識到我們已經「閱讀」電子郵件,可能需要註銷。所以我認爲登錄和註銷也應該重複。我會修改我的代碼。 –

+0

@SamChats'AttributeError:'元組'對象沒有屬性'replace'' – keeganjk

相關問題