Показать сообщение отдельно
Старый 11.03.2020, 18:00   #5  
mikki_messer is offline
mikki_messer
Участник
 
91 / 20 (1) +++
Регистрация: 20.04.2010
Адрес: Ростов-на-Дону
И ещё:

насколько я понимаю, при работе через 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');