2017-06-29 109 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

相关问题