我正在使用.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 Found
和Writing to file...
放置了调试打印语句。但是,这些都没有打印出来,这告诉我循环可能完全被跳过。但是,我确实打印了Local Message Date
和TempDB
,它总是打印与主题相匹配的最新消息,而TemPDB始终为空。此外,确实发生了#DO THE THING
中发生的动作。问题是,即使应该将其写入该脚本已经读取的.CSV文件,它也会继续使用相同的电子邮件。我在这里做什么?预先感谢您!
,结果并不是该文件为空的事实的粉丝。我尝试插入一个虚拟值,并将其修复。它的功能不佳,因为相同的条目不断添加到.CSV文件中,但是解决了此问题本身。