Python с использованием IMAP, как я могу читать электронные письма из входящих сообщений с заданной даты и времени и до сих пор с заданной темой - PullRequest
0 голосов
/ 28 февраля 2019

Я могу читать сообщения на заданную тему.

Сначала при инициализации я захожу в почту, используя IMAP

self.mail = imaplib.IMAP4_SSL(imapName, imapPort)

, затем я могу читать электронные письма с заданной темой, используя этот метод:

def readEmailWithSubject(self, mySubject, fromDateTime):
    self.mail.list()
    self.mail.select("inbox")
    subjectStr = '(HEADER Subject ' + "\"" + mySubject + "\"" + ')'
    result, UIDemailsWithGivenSubject = self.mail.uid('search', None, subjectStr)

Что я действительно хочудолжен использовать fromDateTime в формате UTC Zulu, т.е.

2019-02-28T19:43:42.529791Z  

и читать электронные письма на входящие сообщения с заданной темой только с этой даты / времени до СЕЙЧАС (текущая программа времени работает).Важно, чтобы я использовал минуты.Так что в моем случае выше всех писем от времени UTC: 28 февраля, время 19 час и 43 мин.Письма приходят каждые 30 минут, поэтому я должен убедиться, что я использую и минуты.

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Я полагаю, что это может сработать.

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

0 голосов
/ 04 марта 2019

Вам необходимо отфильтровать некоторые результаты поиска, которые вы получите, но общая логика будет такой:

  • выдача IMAP-поиска для ограничения по теме и дате вместе
  • создать идентификатор из результирующего набора идентификаторов, возвращенных поиском
  • предоставить идентификатор, установленный для сервера, с помощью Fetch для заголовка Date
  • перебрать возвращенные даты, обрезать "Дата: "через разделение, обрезать пробелы
  • преобразовать оставшуюся строку в дату и время, используемое для сравнения
  • удалить все идентификаторы, у которых дата и время находятся за пределами желаемого окна
0 голосов
/ 01 марта 2019

Обычно это невозможно сделать только с помощью поиска на стороне сервера.Язык поиска IMAP поддерживает только детализацию дня (без определенного часового пояса).Вам нужно будет выполнить поиск, получить метаданные (например, поле INTERNALDATE), а затем снова выполнить локальный фильтр.

Другой альтернативой является использование гарантий, предоставляемых UID.У новых сообщений всегда увеличивается UID (при условии, что ваш почтовый ящик не регенерирован), так что вы можете использовать это для обнаружения новых сообщений.

Если вы отслеживаете самый высокий UID, который вы обработали до сих пор, вы можете искатьтолько для сообщений с более новыми UID.Предполагая, что ваш сервер хорошо реализован, и вы не перемещаете сообщения в папку, вы можете добавить поисковый запрос UID n:*, где n на единицу больше, чем самый высокий UID, который вы обработали.Это означает диапазон от n до самого высокого сообщения в поле.

searchStr = '(UID %d:* HEADER Subject ' + "\"" + mySubject + "\"" + ')' % uidStart

и сохранение (uid + 1) где-нибудь (база данных, на диске, в памяти и т. Д.) Для любого сообщения, которое вы обрабатываете, которое большечем текущий наибольший UID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...