Pobranie nagłówków wiadomości email

0

Witam.

W jaki sposób najszybciej pobrać nagłówki wiadomości email?
Próbuję to zrobić przez IMAP wykorzystując bibliotekę MailKit, ale trwa to strasznie długo (nagłówki 100 wiadomości pobierają się prawie 40 sekund).

IList<UniqueId> idList = inbox.Search(query, cancel.Token).OrderBy(x => x.Id).ToList();;
foreach (var uid in idList)
{
  var headers = inbox.GetHeaders(uid, cancel.Token);
}                

W jak sposób zrobić to lepiej/szybciej?

Pozdrawiam

0

Nie możesz tego zrobić asynchronicznie w jakiś sposób? Teraz masz synchronicznie całość więc stąd taki czas... Zresztą masz tam cancellationToken więc to powinno być asynchroniczne 😛

0
hipekk napisał(a):

ale trwa to strasznie długo (nagłówki 100 wiadomości pobierają się prawie 40 sekund).

Pobranie czegoś podobnego np Thunderbirdem (służbowym nie używanym od piątku) trawa podobnie.
Jakbym był providerem internetowym / sprzedawcą komercyjnego serwera na pewno dałbym jakiś throttling - żeby jeden user nie zabił całości.

0

Odpal po kilka wątków (Tasków) na raz.

Ewentualnie w Paralell Forze/Foreachu

var primeNumbers = new ConcurrentBag<int>();

Parallel.ForEach(numbers, number =>
{
    if (IsPrime(number))
    {
        primeNumbers.Add(number);
    }
});
0

Próba zrównoleglenia pobierania kończy się wyjątkiem

The ImapClient is currently busy processing a command in another thread. Lock the SyncRoot property to properly synchronize your threads.

Chyba nie uda się tego zrobić :/

1

@hipekk: ale to dla każdego wątku musisz mieć osobnego ImapClienta

2

Z ciekawości zapytałem ChatGPT co myśli na ten temat i wypluł, coś co wygląda sensownie:

Cześć!

Jeśli chcesz pobierać tylko nagłówki wiadomości, to możesz spróbować zastosować metodę Fetch zamiast GetHeaders. Metoda Fetch pozwala na pobranie jednocześnie wielu elementów, co może przyspieszyć proces pobierania nagłówków. Możesz również zastosować selektor nagłówków (HEADER) przy użyciu metody Search, co pozwoli na pobranie tylko tych wiadomości, których nagłówki Cię interesują. Na przykład:

IList<UniqueId> idList = inbox.Search(SearchQuery.HeaderContains("From", "example.com"), cancel.Token).OrderBy(x => x.Id).ToList();;
var headers = inbox.Fetch(idList, MessageSummaryItems.Headers, cancel.Token);

Jeśli nadal zauważysz, że pobieranie nagłówków trwa zbyt długo, możesz spróbować skorzystać z innego protokołu, na przykład POP3. Protokół POP3 jest bardziej zoptymalizowany do pobierania wiadomości offline i może być szybszy w pobieraniu nagłówków niż IMAP.

Mam nadzieję, że to Ci pomoże!

1

@Wilktar: dzięki wielkie.
Pobranie nagłówków do wszystkich wiadomości w skrzynce (ok 40 tys. wiadomości) przy użyciu Fetch zajmuje ok 10 min, więc to całkiem niezły wynik porównując z czasem przy wykorzystaniu GetHeaders.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.