Как я могу использовать MailKit ImapClient для чтения сообщений, когда он находится в режиме ожидания?

1

Я использую IdleAsync чтобы получать уведомления о новых сообщениях электронной почты.

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

Нужно ли создавать другой ImapClient или использовать один и тот же клиент для чтения сообщения, не останавливая получение уведомлений о новых сообщениях?

Теги:
imap
mailkit
mime

3 ответа

2
Лучший ответ

Как отмечал Nameless One, методы MailKit Idle() и IdleAsync() берут "сделанный" CancellationToken, который можно использовать для завершения состояния IDLE (когда вы отмените токен "done", он отправит команду DONE, тем самым заканчивая IDLE государство).

Как только вы это сделаете, вы можете получать сообщения и продолжать работу в обычном режиме.

Другой вариант, который некоторые люди делают, состоит в том, чтобы иметь 2 ImapClients - один используется для Idle(), а другой используется для извлечения сообщений.

  • 0
    Я сбит с толку, когда мы отменяем токен "done", мы можем получать сообщения, но мы больше не можем получать уведомления о новых письмах (так как состояние ожидания завершено). это правильно? Таким образом, единственный способ (который я использую прямо сейчас) - это использование двух клиентов IMAP. Один для получения новых писем (Idle) и другой для получения писем. Также у меня есть еще одно сомнение, когда IMAP-клиент находится в состоянии ожидания, получим ли мы какой-либо uid или что-то еще для вновь прибывшей почты, чтобы мы могли получить это сообщение, используя этот идентификатор. Прямо сейчас я использую folder.Count-1, чтобы прочитать первое письмо.
  • 1
    Правильно, когда вы отменяете doneToken, вы прекращаете получать уведомления о новых сообщениях, но вы можете снова вызвать Idle () после получения новых сообщений.
Показать ещё 2 комментария
2

Рик Сандерс прав, что вам нужно отправить ответ DONE (см. RFC2177 о том, как работает IMAP IDLE и DONE).

Несмотря на то, что я не знаком с mailkit, или Отмена, похоже, Idle метод принимает CancellationToken который можно отменить, вызвав Cancel() на его CancellationTokenSource. Затем необходимо отправить команду DONE мере необходимости.

  • 0
    Вы правы, когда doneToken отменен, он отправит команду DONE, выходя из состояния IDLE. Я обновлю документы, чтобы упомянуть об этом.
2

В состоянии IDLE единственной командой, которую вы можете отправить, является DONE, которая завершает IDLE. Вы можете использовать CONDSTORE и обнаруживать новые сообщения, используя HIGHESTMODSEQ, если вы не возражаете против опроса.

  • 0
    Я должен использовать только MailKit. Так что я ищу ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню