Есть ли функция, которая заставит этот монитор электронной почты прочитать электронное письмо только один раз?

#python

#python

Вопрос:

Я настраиваю систему мониторинга внутри более крупной программы, которая будет проверять наличие электронного письма по заданному адресу электронной почты для адреса электронной почты и ссылки. В настоящее время он ищет электронное письмо только из массива, который содержит электронные письма из файла. Тем не менее, я также хочу, чтобы он искал ссылку. Теперь, если оба они найдены, я хочу, чтобы он отправил электронное письмо на адрес электронной почты, найденный внутри полученной почты. Кроме того, эта программа будет постоянно выполняться для чтения электронных писем и не остановится, когда программа их прочитает.

 def sendHotmail(receivingEmail, name):
    email = EmailMessage()

    email['Subject'] = subject
    email['From'] = myEmail
    email['To'] = receivingEmail
    if count == 0:
        email.set_content('Hello {},nI have attached the link to the servey that you will need to completenn www.google.com'.format(name))
    else:
        email.set_content('Hello {},nHere is the link to your certificate{}'.format(name, link))

    s = smtplib.SMTP(host='smtp.live.com', port = 587)
    s.starttls()
    s.login(myEmail, myEmailPass)

    s.send_message(email)
    s.quit()

def monitorHotmail():
    m = imaplib.IMAP4_SSL('imap-mail.outlook.com',993)
    m.login(myEmail, myEmailPass)
    print(m.list())
    m.select("Inbox")  # <-- response like ('OK', ['74']) --> total no. of mail in sent folder
    while emailsSent != emailsReceived :
        result, data = m.uid('search', None, "ALL") # search all email and return uids
        if result == 'OK':
            for num in data[0].split():
                result, data = m.uid('fetch', num, '(RFC822)')
                if result == 'OK':
                    email_message = email.message_from_bytes(data[0][1])    # raw email text including headers
                    sentBy = email_message['From']
                    sentBy = sentBy.split(' ')
                    if sentBy[2] == '<xxxxx@gmail.com>':    
                        if email_message.is_multipart():
                            for payload in email_message.get_payload():
                                message = payload.get_payload()
                                for emailFound in emails:
                                    if emailFound in message:
                                        print(emailFound)
  

Кроме печати электронных писем, найденных в сообщении, навсегда, пока электронное письмо не будет удалено или программа не будет остановлена, и она не будет завершена, это отлично работает.

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

1. Здравствуйте, я надеюсь, у вас все отлично! Можете ли вы объяснить, что такое: — emailsSent — emailsReceived Спасибо

2. При чтении файла он суммирует 1 для каждого зарегистрированного электронного письма, которое затем используется для отправки первого электронного письма. Он отслеживает, чтобы знать, когда ему нужно прекратить мониторинг почтового ящика адреса электронной почты, который отправил первые электронные письма. Я надеюсь, что каждый раз, когда email получает сообщение с другим адресом электронной почты (который находится в массиве), оно будет суммироваться до тех пор, пока отправленное по электронной почте сообщение не будет равно = emailsReceived по электронной почте

Ответ №1:

Измените поиск, чтобы искать только невидимые электронные письма. Флаг «Просмотрено» будет установлен, как только вы получите тело RFC822 (при условии отсутствия просмотра), поэтому, если ваш поиск ищет только «Невидимое», вы увидите каждое сообщение только один раз.

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

1. Хорошо, это почти сработало, за исключением того, что, похоже, оно прочитало электронное письмо 2 или 3 раза, как показано при печати найденного