Python IMAP: проблемы с базой данных CSV

#python #python-3.x #csv #imaplib

#python #python-3.x #csv #imaplib

Вопрос:

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

Комментарии:

1. «считывание всех значений в массив tempDB» : удалить if any(row):

Ответ №1:

Как оказалось, это не был фанат того факта, что файл был пуст. Я попытался вставить фиктивное значение, и это исправило его. Это работает не идеально, поскольку в файл .csv продолжает добавляться одна и та же запись, но сама эта проблема решена.