Мне нужно создать сервисное (или консольное) приложение, которое подключается к серверу IMAP и прослушивает новую почту. В настоящее время я пытаюсь использовать MailKit, но у меня возникают проблемы с попыткой выяснить, как это сделать из документации.MailKit: получение нового почтового уведомления с сервера IMAP
Ближайший я приехал от this почты. Из того, что я вижу, этот пост устанавливает соединение в режим IDLE и иногда отправляет NoOP, чтобы попытаться сохранить соединение в живых. Мне не совсем понятно, как получить новое уведомление по почте.
Документация MailKit, по-видимому, указывает, что имеется доступное событие предупреждения. Я пытался подключиться к этому, но, похоже, ничего не исправляет.
Вот что я пробовал:
var cts = new CancellationTokenSource();
testIDLEMailNotification(cts.Token);
...
private static void testIDLEMailNotification(CancellationToken token)
{
using (var client = ClientCreateAndConnect(token))
{
while(!token.IsCancellationRequested)
{
using (var done = new CancellationTokenSource())
{
using (var timer = new System.Timers.Timer(9 * 60 * 1000))
{
timer.Elapsed += (sender, e) => done.Cancel();
timer.AutoReset = false;
timer.Enabled = true;
try
{
client.Idle(done.Token, token);
client.NoOp(token);
}
catch (OperationCanceledException)
{
break;
}
}
}
}
}
}
private static ImapClient ClientCreateAndConnect(CancellationToken token)
{
var client = new ImapClient();
client.Connect("server.domain", 993, true, token);
client.AuthenticationMechanisms.Remove("XOAUTH");
client.Authenticate("[email protected]", "password",token);
client.Inbox.Open(MailKit.FolderAccess.ReadWrite, token);
client.Alert += client_Alert;
return client;
}
static void client_Alert(object sender, AlertEventArgs e)
{
Console.WriteLine("New Email or something.");
}
Mailkit неплохой и сделает то, что хочет OP. Ссылка в вопросе даже говорит, что включает пример программы под названием «imapidle». – arnt
RFC3501 ничего мне не говорит о внедрении IMAP-клиента с MailKit, о чем я и говорил. Мой вопрос касался MailKit и того, как MailKit реализует обработку новых почтовых уведомлений. Я согласен с тем, что RFC3501, возможно, поможет моему пониманию IMAP, но он не собирается ничего делать, чтобы помочь мне с MailKit. Да, я мог бы использовать другую библиотеку, но когда у меня есть львиная доля кода, написанного и работающего, я не думаю, что его необоснованно спросить о SO, чтобы узнать, знает ли кто-то другой (может быть, автор), как его реализовать. – RHarris
Проблема с кодом, который вы показали, заключается в том, что он пытается использовать довольно сырые события IMAP, а не те события, которые уже переведены в состояние высокого уровня удаленного почтового ящика. Кажется, что вы нашли часть MailKit, которая реализует необходимый вам интерфейс, что хорошо. –