Я создаю псевдобазу, используя файл .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, который этот скрипт уже прочитал. Что я здесь делаю неправильно? Заранее спасибо!