Indy POP3 - zmiana ilości wiadomości podczas przetwarzania

0

Może pytanie wyda się komuś banalne, ale nie umiem (nie mam konceptu) ugryźć takiego problemu:

Mam system, w którym aplikacja/aplikacje w oddziałach firmy wysyłają przesyłki z danymi drogą emailową. Nieważne co zawierają. Przesyłki ładnie wychodzą z końcówek i docierają pod wskazany adres.

Kłopot zaczyna się po drugiej stronie.

Korzystam w swojej aplikacji z komponentu TidPOP3 z palety Indy - generalnie robi czego oczekuję od niego (odbieranie wiadomości). Kolektor działa cyklicznie co zadany interwał czasu (np. co godzinę) i sprawdza czy na skrzynce są jakieś wiadomości - jeżeli są - przetwarza je. Zdarza się jednak od czasu do czasu, ze w trakcie przetwarzania przesyłek - zostanie dosłana nowa wiadomość i automatycznie numeracja wiadomości zostaje zaburzona, bo najmłodsze wiadomości mają najnizszy numer.

Pytanie: Jak sprawdzić/oznaczyć/odczytać które wiadomości nie były jeszcz przetworzone = jak zrobić liste unseen

Robię to po swojej stronie utrzymując w bazie danych specjalną tabelę z odpowiednimi znacznikami, ale jej głównym przeznaczeniem jest identyfikowanie przesyłek, które zostały poprawnie zaimportowane.

Zapewne odpowiedź jest banalna i znajdę ją w Google, ale nie bardzo wiem jak go zapytać o to (to znaczy na razie dostaję jedynie śmieci)

0

A nie możesz sobie zrobić stringlisty w której po przetworzeniu będziesz przechowywał ID przesyłki? Przy każdym sprawdzeniu wystarczy, że sprawdzisz czy ID przesyłki znajduje się już na liście. Dzięki temu wszystkie, których nie ma na liście będą jako nieprzeczytane/nieprzetworzone

0

Generalnie robie coś podobnego przechowując listę przetworzonych przesyłek w tabeli w BD.

Kłopot w tym, że procedura wygląda mniej więcej tak:

  1. odczyt ilosci wiadomości znajdujących się na serwerze = n_wiad
  2. przetwarzanie wiadomosci 1 .. n_wiad

kłopot pojawia się w momencie, gdy w trakcie przetwarzania przesyłek (czasem jest ich kilkanaście, a przetworzenie kazdej zajmuje jakiś tam czas - łącznie np 10-15 min - nie pytajcie dlaczego, bo generalnie czas przetwarzania nie ma tutaj wiekszego znaczenia).

Kłopot jest wtedy, kiedy w trakcie przetwarzania przesyłek dojdzie nowa. Zmienia sie numeracja przesyłek i moj program głupieje.

Poza tym - wszystkie wiadomości przechowywane sa na serwerze (rodzaj backupu) i przynajmniej na razie tak musi być.

chciałem użyć metody UIDL i porownać ją z listą znajdujaca się na serwerze, ale kurczaczki - nie umiem sobie z nia poradzić. To znaczy - identyfikatory sa zupełnie inne niż znaczniki MessageId, którymi ja się posługuję.

Wydaje mi się (ale tylko wydaje), że któryś program pocztowy robił taki manewr, że zaznaczenie przeczytania wiadomości po stronie klienta "implikowało' ten sam znacznik po stronie serwera.

Może się mylę, ale może jednak jest coś takiego możliwe. Może wysłanie jakiejś konkretnej komendy.

0

Złapałem w końcu robaczka, ale nie rozumiem dlaczego tak się zachowuje

Cannot create file "C:\windows\system32\application\octet-stream; name="export_DIAL0004_20100330_1938_3.xzp"". System nie może odnaleźć określonej ścieżki

błąd pojawia się w momencie, gdy robię:

IdPOP3.Retrieve(iw, IdMessage);

gdzie iw to identyfikator wiadomosci , a idMessage to komponent Indy: TidMessage

nie rozumiem dlaczego chce zapisywac do takiej dziwnej sciezki - ja jej nigdzie w programie nie ustawiam.

Najgorsze, ze nie ma reguły kiedy sie to wywala - zazwyczaj już przy drugim obrocie pętli (przy odbieraniu drugiej wiadomosci), a czasami przejdzie kilka i wywala sie np na 4 (a druga, przy ktorej zazwyczaj sie wywala - przechodzi).

Najgorsze, że jest to usługa i nie ma tego za bardzo jak debuggować (poza logowaniem do pliku) :(

EDIT:

Gdzieś na googlach wyczytałem, że (co prawda temat dotyczył innego komponentu Indy i w ciut innym kontekscie) może to być związane z niedomykaniem dojść do plików. Nie bardzo jednak to rozumiem, bo zanim zrobie Retrive, robie idMEssage.Clear;

0

Ja podobny problem mialem przy odczytywaniu TYLKO nowszych zdarzen na bazie danych co prawda ID mi sie nie zmienial aczkolwiek rozwiazalem to w oparciu o date. W momencie gdy wchodzila petla sprawdzajaca porownywalem date czy nie ma jej w stringliscie. Sek w tym ze w moim przypadku zrobilo zrobic while not eof na query zapisac do stringlisty i zrobic query.refresh a nastepnie porownach nowe query ze stara stringlista. Nic wiecej ci nie pomoge

0

Spoko - z problemem odczytywania tylko wybranych emaili już sobie poradziłem. Ściągam tylko nagłówki (nie wiadomo czemu wcześniej uparcie ciągnąłem całego emaila) - sprawdzenie 800 nagłówków trwa ok 20 sek (na 8 Mbit łączu) więc nie tragedia - tym bardziej, że działa to w tle i wymaganiem klienta jest aktualizacja danych co najmniej raz na dzień - jeżeli będzie to robił szybciej (co w założeniu ma robić na bieżąco) - będzie gites.

Kłopot w tym, że kiedy stwierdzę, że pasuje odczytać całą wiadomość - wywala mi błędy jak w poprzednich postach.

Robię tak:

idMessage.Clear;
idPOP3.RetriveHeader
<sprawdzanie, czy nagłówek ma odpowiednie znaczniki>
idMessageClear;
idPOP3.Retrive;

na ostatniej operacji mi sie wywala.

0

Chyba palnę sobie w głowę

Przekopiowałem zawartość aplikacji działającej w trybie usługi do nowego projektu aplikacji desktopowej (aplikacja ma raptem trzy metody).

I co ?

I generalnei zazwyczaj działa.

To znaczy - potrafi jednym ciągiem zaczytać 100 paczek, po czym zgłasza błąd w bibliotece kernel32.dll . Odpalam aplikacje jeszcze raz i co ? I przetwarza dalej. Okej - możliwe, że jest to związane z połączeniem do serwera (ze zamyka mi sie w trakcie przetwarzania duzych paczek, a ja tego nie obsluguje).

Ale do jasnej ciasnej - dlaczego nie wywala mi bledow takiej postaci jak porpzednio.

o co kurna kaman.

1 użytkowników online, w tym zalogowanych: 0, gości: 1