Я использую IdleAsync
чтобы получать уведомления о новых сообщениях электронной почты.
Я хочу получать уведомления каждый раз, когда приходит новое сообщение, а затем читает сообщение, но когда я пытаюсь прочитать сообщение, я получаю исключение, что ImapClient
находится в состоянии ожидания.
Нужно ли создавать другой ImapClient
или использовать один и тот же клиент для чтения сообщения, не останавливая получение уведомлений о новых сообщениях?
Как отмечал Nameless One, методы MailKit Idle() и IdleAsync() берут "сделанный" CancellationToken, который можно использовать для завершения состояния IDLE (когда вы отмените токен "done", он отправит команду DONE, тем самым заканчивая IDLE государство).
Как только вы это сделаете, вы можете получать сообщения и продолжать работу в обычном режиме.
Другой вариант, который некоторые люди делают, состоит в том, чтобы иметь 2 ImapClients - один используется для Idle(), а другой используется для извлечения сообщений.
Рик Сандерс прав, что вам нужно отправить ответ DONE
(см. RFC2177 о том, как работает IMAP IDLE
и DONE
).
Несмотря на то, что я не знаком с mailkit, или Отмена, похоже, Idle метод принимает CancellationToken
который можно отменить, вызвав Cancel()
на его CancellationTokenSource
. Затем необходимо отправить команду DONE
мере необходимости.
В состоянии IDLE единственной командой, которую вы можете отправить, является DONE, которая завершает IDLE. Вы можете использовать CONDSTORE и обнаруживать новые сообщения, используя HIGHESTMODSEQ, если вы не возражаете против опроса.