Notyfikator pocztowy [INDY][IdPOP3]

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

Notyfikator pocztowy [INDY][IdPOP3]

Nowy postprzez Rafał » sobota, 31 stycznia 2009, 12:02

Witam!

Próbuję stworzyć notyfikator pocztowy, który by informował o nowej poczcie i wyświetlał stosowny komunikat. Niby działa, ale tylko za pierwszym razem. Za każdym kolejnym (mimo iż poczty przybywa - bo przysyłam na maila z innego konta wiadomości) notyfikator nie wykrywa ilości zmian i nie informuje o tym.

Uzywam C++ Builder 2007 Enterprise z pakietem INDY. Gdyby ktoś mógł spojrzeć, co jest nie tak, bo ja już głupi jestem.

Dla połączenia nieszyfrowanego:

Kod: Zaznacz cały
void TForm1::Polaczenie()
{
if (IdPOP31->Connected() == true) {
IdPOP31->Disconnect();
}
IdPOP31->Host=Edit3->Text;
IdPOP31->Username=Edit5->Text;
IdPOP31->Password=Edit6->Text;
IdPOP31->Port=Edit4->Text.ToInt();
il_wiad=Label7->Caption.ToInt();
IdPOP31->Connect();
nowa_ilosc=IdPOP31->CheckMessages();
IdPOP31->Retrieve(nowa_ilosc, IdMessage1);

if (nowa_ilosc > il_wiad) {
ShowMessage("Odbieranie wiadomości: " + IntToStr(nowa_ilosc) + " Od: " + IdMessage1->From->Text + " Temat: " + IdMessage1->Subject);
Label7->Caption=nowa_ilosc;
}
IdPOP31->Disconnect();
}


Dla połączenia szyfrowanego:

Kod: Zaznacz cały
void TForm1::PolaczenieSzyfrowane()
{
if (IdPOP31->Connected() == true) {
IdPOP31->Disconnect();
}
TIdSSLIOHandlerSocketOpenSSL *IdSSLIOHandlerSocketOpenSSL1;
IdSSLIOHandlerSocketOpenSSL1 = new TIdSSLIOHandlerSocketOpenSSL(this);
IdPOP31->IOHandler=IdSSLIOHandlerSocketOpenSSL1;
IdPOP31->UseTLS=utUseImplicitTLS;
IdSSLIOHandlerSocketOpenSSL1->Port=Edit4->Text.ToInt();
IdSSLIOHandlerSocketOpenSSL1->Host=Edit3->Text;
IdSSLIOHandlerSocketOpenSSL1->UseNagle=false;
IdSSLIOHandlerSocketOpenSSL1->SSLOptions->Method=sslvSSLv2;
IdSSLIOHandlerSocketOpenSSL1->SSLOptions->Mode=sslmUnassigned;
IdSSLIOHandlerSocketOpenSSL1->Destination=Edit3->Text+":"+Edit4->Text;
IdSSLIOHandlerSocketOpenSSL1->DefaultPort=Edit4->Text.ToInt();
IdSSLIOHandlerSocketOpenSSL1->ReadTimeout=100;

IdPOP31->Host=Edit3->Text;
IdPOP31->Username=Edit5->Text;
IdPOP31->Password=Edit6->Text;
IdPOP31->Port=Edit4->Text.ToInt();
il_wiad=Label7->Caption.ToInt();
IdPOP31->Connect();
nowa_ilosc = IdPOP31->CheckMessages();
IdPOP31->Retrieve(nowa_ilosc, IdMessage1);

if (nowa_ilosc > il_wiad) {
ShowMessage("Odbieranie wiadomości: " + IntToStr(nowa_ilosc) + " Od: " + IdMessage1->From->Text + " Temat: " + IdMessage1->Subject);
Label7->Caption=nowa_ilosc;
}
IdPOP31->Disconnect();
delete IdSSLIOHandlerSocketOpenSSL1;
}


Zmienne il_wiad oraz nowa_ilosc są zmiennymi globalnymi, zadeklarowanymi poprawnie. Label7 wyświetla ilość wiadomości, a nowa_wartość jest pobierana poprzez CheckMessages() i porównywana ze "starą wartością" il_wiad.

Dziękuje za wszelkie dobre rady.
Avatar użytkownika
Rafał
Bladawiec
Bladawiec
 
Posty: 3
Dołączył(a): sobota, 31 stycznia 2009, 11:58
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Notyfikator pocztowy [INDY][IdPOP3]

Nowy postprzez Cyfrowy Baron » sobota, 31 stycznia 2009, 13:30

Musisz funkcję Polaczenie() wywoływać w określonych odstępach czasu, gdyż sama nie będzie się wywoływać.
Sprawdź jakie wartości przechowują po wywołaniu funkcji te dwie zmienne, czy wartości się zmieniają.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Notyfikator pocztowy [INDY][IdPOP3]

Nowy postprzez Rafał » sobota, 31 stycznia 2009, 13:36

Funkcja jest wywoływana w Timerze, ustawiony on był na 5 sekund. Uznałem, że to może zbyt mało na zrealizowanie całego toku połączenia i dlatego ten problem, więc zwiększyłem interwał do 30 sekund, ale problem nie ustąpił. Co do zmiennych - sprawdzę i dopiszę do posta, co i jak.
Avatar użytkownika
Rafał
Bladawiec
Bladawiec
 
Posty: 3
Dołączył(a): sobota, 31 stycznia 2009, 11:58
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Notyfikator pocztowy [INDY][IdPOP3]

Nowy postprzez Cyfrowy Baron » sobota, 31 stycznia 2009, 14:36

Sprawdzanie powinno się odbywać w odstępach co najmniej 1 minuty, zalecałbym przeprowadzić testy najpierw z interwałem 5 minut.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Notyfikator pocztowy [INDY][IdPOP3]

Nowy postprzez Rafał » sobota, 31 stycznia 2009, 15:11

Tak, po zwiększeniu interwału działa prawidłowo, wykrywa nową wiadomość i ją wyświetla. Dziękuję Cyfrowy_Baronie za pomoc.

Uzupełniając swoją wiedzę, pragnę zapytać: czy ten interwał to jakieś ograniczenie kontrolek Indy czy może zabezpieczenia serwera, przed zbyt częstymi połączeniami ?
Avatar użytkownika
Rafał
Bladawiec
Bladawiec
 
Posty: 3
Dołączył(a): sobota, 31 stycznia 2009, 11:58
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Notyfikator pocztowy [INDY][IdPOP3]

Nowy postprzez Cyfrowy Baron » sobota, 31 stycznia 2009, 15:18

To ma po części związek z serwerem jak również z samą biblioteką INDY, która przy małym interwale czasu nie jest w stanie wykonać wszystkich operacji.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości

cron