Witam, podczas pisania klienta pocztowego napotkałem problem. Dotyczy on niektórych kont pocztowych tj. yahoo.com czy onet.pl. Podczas sprawdzenia ilości wiadomości w skrzynce (IdPOP31.CheckMessages) wyskakuje błąd "Invalid command" w yahoo.com lub "Unknown command" w onet.pl . Uniemożliwia to odbieranie wiadomości ze skrzynki przy użyciu pętli.
Jakie Delphi, jaka wersja Indy? Może tak trochę kodu czy szklaną kulę pora odkurzyć?
Przykład dla Indy 10 logowanie i pobrania nagłówków wiadomości z onet (yahoo nie sprawdzałem)
var
i, NumMsgs: integer;
begin
IdPOP31.Host:= 'pop3.poczta.onet.pl'; //w przykladzie dla onet np. dla gmail 'pop.gmail.com';
IdPOP31.Port:= 110; //najczesciej 110 ale dla polaczen SSL np. dla gmail 995;
IdPOP31.Username:= 'email@op.pl'; //adres emai;;
IdPOP31.Password:= 'haslo'; //haslo
//IdPOP31.UseTLS := utUseImplicitTLS; //potrzebne np. do gmail
try
if not IdPOP31.Connected then
IdPOP31.Connect; //laczenie
if IdPOP31.Connected then //czy polaczony
begin
NumMsgs:=IdPop31.CheckMessages; //ile maili
Memo1.Lines.Add( 'Wszystkich Emaili:' +IntToStr(NumMsgs) ); //wpisz do memo dla przykladu
for i:=1 to NumMsgs do begin
IdPOP31.RetrieveHeader(i, IdMessage1); //odczytaj tylko naglowek (bez tresci)
Memo1.Lines.Add( 'Numer: '+ IntToStr(i) + //wpisz do memo dla przykladu
' Od: '+ IdMessage1.From.Text +
' Temat: '+ IdMessage1.Subject);
if (IdMessage1.Subject = 'cos tam') then //czy nazwa (temat) sie zgadza?
begin
//tu cos robisz
break; //dalej nie szukamy
end;
IdMessage1.Clear;
end;
IdPOP31.Disconnect;
end;
except
on e: Exception do
ShowMessage(E.Message);
end;
end;
EDIT// Tytuł wątku wszystko mówi wprost idealnie dobrany
Moj klient pocztowy posiada liste kont pocztowych zapisanych w combobox. Podczas wyboru elementu listy wczytywane sa odpowiednie wartosci do komponentu idpop3 i idsmtp czyli haslo, port etc. Jezeli polacze sie na poczatku z onet.pl to odczytuje normalnie ta poczte. Natomiast jezeli rozlacze sie z ta poczta i polacze np z wp to tez dziala poprawnie, jednak jak rozlacze z wp i polacze sie na onet to po poprawnym polaczeniu wyskakuje ten blad.
No skoro raz łączy poprawnie raz nie w zależności od tego czy uprzednio nie łączyłeś się z WP to coś musi być nie tak ale bez kodu trudno zgadywać co.
Kawałek kodu z ComboBox :
procedure TForm1.ListaChange(Sender: TObject);
...
if Lista.ItemIndex=8 then
begin
SPP.Text:= 'pop.mail.yahoo.com';
SPW.Text:= 'smtp.mail.yahoo.com';
PortP.Text:=IntToStr(995);
PortW.Text:=IntToStr(587);
SSL.Checked:=True;
CzySSL:=SSL.Checked;
SSLConnection(CzySSL); // procedura odpowiedzialna za załączenie TidSSLIOHandlerSockedOpenSSL do właściwości IOHandler w idPOP3 i IdSMTP
end;
if Lista.ItemIndex=9 then
begin
SPP.Text:= 'pop3.poczta.onet.pl';
SPW.Text:= 'smtp.poczta.onet.pl';
PortP.Text:=IntToStr(110);
PortW.Text:=IntToStr(587);
SSL.Checked:=False;
CzySSL:=SSL.Checked;
SSLConnection(CzySSL);
end;
...
Kawałek kodu przycisku Połącz:
procedure TForm1.PolaczClick(Sender: TObject);
...
IdSMTP1.Host:= SPW.Text;
IdPOP31.Host:= SPP.Text;
if Lista.ItemIndex=0 or 7 or 8 or 10 then
begin
SMTPssl.Host:=SPW.Text;
POP3ssl.Host:=SPP.Text;
end;
if Lista.ItemIndex=10 then
begin
Temp:=SSL.Checked;
SSLConnection(Temp);
end;
IdSMTP1.Username:= Adres.Text;
IdSMTP1.Password:= Haslo.Text;
IdPOP31.Username:= Adres.Text;
IdPOP31.Password:= Haslo.Text;
IdPOP31.Port:=StrToInt(PortP.Text);
IdSMTP1.Port:=StrToInt(PortW.Text);
try
IdPOP31.Connect;
IdSMTP1.Connect;
...
Przy buttonie Rozłącz
...
IdSMTP1.Disconnect;
IdPOP31.Disconnect;
...
sprawdzenie ilości wiadomości w skrzynce:
...
Label15.Caption:='Ilość wiadomości w skrzynce : ' + IntToStr(IdPOP31.CheckMessages);
...
Program posiada opcje zapisu do pliku konfiguracji poczty czyli username, password etc.
W FormCreate następuje przypisanie tych wartości z pliku jeżeli istnieje, w przeciwnym wypadku ustawia własciwości z listy nr1 z ComboBox'a.
Stworzyłem nową formę aby zrobić test dla konta w yahoo.com, po pomyślnym połączeniu protokołem POP3 kliknąłem na idpop31.checkmessages. W rezultacie "Invalid command". Host dla IOHanlderSSLSockedOpenSSL pop.mail.yahoo.com, port 995, SSLOptions.Method - sslvsslv3, w idpop3 autologin := Fals oraz UseTLS := utUseTLSimplicitTLS. Z takimi ustawieniami łączy bez problemu z pocztą (no i odpowiednie biblioteki wymagane).
Usunąłem z listy możliwość wyboru yahoo.com i inne powiązania w kodzie z nim związane. Rezultatem jest prawidłowo działający odczyt ilości wiadomości dla każdego elementu listy. Ale jak rozwiązać problem yahoo.com?
Kawałek kodu z ComboBox :
Jesteś na tyle tępy żeby nie czytać tekstu NA ZÓŁTO podczas tworzenia nowego tematu??? No cóż, to już coś pokazuje na początek. Nie umiesz czytać wskazówek.
Ale jak rozwiązać problem yahoo.com?
Zacznij może od poczytania wskazówek na ten temat np. w googlach bo już pokazałeś że tego nie robisz. I popraw kod, to może ktoś na niego spojrzy.
if Lista.ItemIndex=0 or 7 or 8 or 10 then
Fucking genius.
http://ideone.com/eaPAu
Tylko liczba 15
spełnia ten warunek, kompilator to nie człowiek i rozumie or
jako (w tym wypadku) bitowe.
Chyba, że o takie zaciemnianie kodu chodziło...
Patryk27 napisał(a):
if Lista.ItemIndex=0 or 7 or 8 or 10 then
Tylko liczba
15
spełnia ten warunek, kompilator to nie człowiek i rozumieor
jako (w tym wypadku) bitowe.
Chyba, że o takie zaciemnianie kodu chodziło...
Wygląda na to że pytaczowi wydaje się że 2+2*2 to 8.
Jestem swiezym programista w delphi i uzytkownikiem forum a problem samego yahoo.com nadal nie rozwiazany. Fakt ten kawalek kodu jest nieptrzebny... I bledny
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.