И ещё:
насколько я понимаю, при работе через POP3 нет возможности запросить только новые письма, каждый раз сервер выдаёт все письма, что есть в ящике.
Поэтому, если нужно сохранять письма на сервере, можно поступить примерно так: для каждого скачанного письма формировать хэш его уникального идентификатора и полей заголовка, и проверять, нет ли у нас в таблице обработанных писем такого хэша? Если нет, обрабатывать письмо, если есть переходить к следующему письму.
Почему хэш - потому что этот идентификатор уникален только в пределах набора писем, получаемого с сервера, и если какое-то письмо было удалено после обработки, идентификатор теоретически может быть выдан новому письму повторно.
Пример кода:
X++:
str currentUID, messageUID;
MailKit.Net.Pop3.Pop3Client pop3Client;
MimeKit.MimeMessage message;
MimeKit.FormatOptions frmt = new MimeKit.FormatOptions();
System.Threading.CancellationTokenSource src = new System.Threading.CancellationTokenSource();
System.Threading.CancellationToken tkn = src.get_Token();
Int mailCnt, i;
System.Collections.IEnumerable lst;
System.Collections.IEnumerator en;
;
try
{
pop3Client = new MailKit.Net.Pop3.Pop3Client();
pop3Client.Connect(serverURI, portNumber, useSSL, tkn);
pop3Client.Authenticate(login, passwd, tkn);
mailCnt = pop3Client.get_Count();
info(strFmt('Total messages: '+int2str(mailCnt)));
//получаем набор уникальных идентификаторов писем
lst = pop3Client.GetMessageUids(tkn);
en = lst.GetEnumerator();
for(i = 0; i< mailCnt; i++)
{
en.MoveNext();
//UID в списке идут в том же порядке, что и письма
currentUID = en.get_Current();
message = pop3Client.GetMessage(i, tkn, null);
//вот здесь генерируем хэш, проверяем, наличие хэша в таблице обработанных писем и, если надо, обрабатываем письмо.
}
pop3Client.Disconnect(true, tkn);
}
catch
{
if (pop3Client)
pop3Client.Disconnect(true, tkn);
error("Error!");
}
info('Done');