Python IMAP:CSV数据库问题

问题描述 投票:0回答:1

我正在使用.csv文件创建一个伪数据库。基本上我正在尝试做的是当我启动我的代码时,我打开.csv文件并将所有值读入数组tempDB,然后进入我的无限循环以定期检查是否有来自某个主题的新电子邮件在循环的每次迭代中,我打开一个.csv编写器。然后我连接到我的Gmail,并搜索与主题匹配的未读电子邮件。解析日期时间,这是用于检查此脚本之前是否已读取电子邮件的内容。我遍历数组,检查新的日期时间字符串是否与.csv文件中的任何内容匹配(由tempDB包含)。如果日期时间字符串与tempDB数组中的任何内容都不匹配,那么我执行某个操作。我之所以用这种方式跟踪电子邮件,而不是让这个脚本将电子邮件设置为read,是因为我有另一个程序在较慢的时间间隔内与相同的电子邮件进行交互。我希望这个能够忽略电子邮件,如果他们已被这段代码看到,但我的其他应用程序将电子邮件标记为已阅读。以下是我的代码:

import imaplib, time, email, mailbox, datetime, csv

server = "imap.gmail.com"
port = 993
user = "Redacted"
password = "Redacted"

def main():
    tempDB = []
    infile = open('MsgDB.csv' 'r')
    reader = csv.reader(infile)
    for row in reader:
        if any(row):
            tempDB.append(row)
    infile.close()
    while True:
        found = False
        outfile = open('MsgDB.csv', 'w', newline='')
        writer = csv.writer(outfile)
        conn = imaplib.IMAP4_SSL(server, port)
        conn.login(user, password)
        conn.select('inbox', readonly=True)
        result, data = conn.search(None, '(UNSEEN SUBJECT "Test Subject")')
        i = len(data[0].split())

        for x in range(i):
            latest_email_uid = data[0].split()[x]
            result, email_data = conn.uid('fetch', latest_email_uid, '(RFC822)')
            raw_email = email_data[0][1]
            raw_email_string = raw_email.decode('utf-8')
            email_message = email.message_from_string(raw_email_string)
            date_tuple = email.utils.parsedate_tz(email_message['Date'])
            local_date = datetime.datetime.fromtimestamp(email.utils.mktime_tz(date_tuple))
            local_message_date = "%s" %(str(local_date.strftime("%a, %d %b %Y %H:%M:%S")))
            for i in range(len(tempDB)):
                if tempDB[i] == local_message_date:
                    print("Item Found")
                    found = True
                    continue
                else:
                    print("Writing to file...")
                    tempDB.append(local_message_date)
                    writer.writerow([local_message_date])
            for part in email_message.walk():
                if part.get_content_type() == "text/plain" and found != True:
                    #DO THE THING
                else:
                    continue
        outfile.close()
        time.sleep(30)

if __name__ == "__main__":
    main()

从我所看到的核心问题是,csv文件永远不会被写入,tempDB永远不会被追加到。正如您将注意到的,我已经为Item FoundWriting to file...安装了调试打印语句。然而,这些都没有打印,这告诉我循环可能完全被跳过。但是,我会打印Local Message DateTempDB,它始终打印与主题匹配的最新消息,并且TempDB始终为空。此外,发生在#DO THE THING的行动。问题是,它将继续使用相同的电子邮件,即使它应该写入.csv文件,该脚本已经读过它。我在这里做错了什么?先感谢您!

python python-3.x csv imaplib
1个回答
0
投票

事实证明,它不是文件空的事实的粉丝。我尝试插入一个虚拟值,并修复它。它不能完美地运行,因为相同的条目不断添加到.csv文件中,但此问题本身已得到解决。

© www.soinside.com 2019 - 2024. All rights reserved.