如何使每封电子邮件只显示一次电子邮件?

时间:2017-06-29 17:19:04

标签: python email while-loop imap python-2.x

我一直在制作一个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 个答案:

答案 0 :(得分:1)

所以你基本上想要开发电子邮件监听器 ... 在下面的代码中,我只是下载看不见的电子邮件,以便我们只拥有相关数据。然后,一旦收到电子邮件,我将其标记为“阅读”。所以它的身份不会再次出现:

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更可靠。不过,这可能需要一些时间。

答案 1 :(得分: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_emailnot,则会list list,然后将其添加到print,以便if not raw_email in list: print raw_email list.append(raw_email) 不会再次self.addChildViewController(newsPageVC) newsPageVC.didMove(toParentViewController: self)

$ae = escapeshellarg($a);
$be = escapeshellarg($b);
// repeat for the rest of variables
$stream_1 = ssh2_exec($ssh, "/root/Script/Auto_Traces/show_ng_trace.sh $ae $be $ce $de $ee");