如何让我的电子邮件每封电子邮件只显示一次?

How can I make my email show only one time per email?

我一直在制作一个 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. 永远重复

所以您基本上想要开发一个 电子邮件侦听器 ... 在下面的代码中,我将只下载看不见的电子邮件,这样我们就有了相关数据。然后,一旦提取了一封电子邮件,我将其标记为 'read',这样它的 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 更可靠。不过,这可能需要一些时间。

我找到了解决方案:

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')

然后,最后,如果list中的not,它会print raw_email,然后将其添加到list所以它不会再被 printed:

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