Witam, mam za zadanie do szkoły napisać "prostego" klienta SMTP POP3 z użyciem komponentu ClientSocket, i mam taki problem, jak mam w antywirusie włączoną ochronę dostępu, to wszystko pięknie ładnie działa i wysyła maila, ale jak wyłączę ochronę, serwer po kilku sekundach odpowiada coś w stylu: Sorry ale za dużo pytań na raz dostaję, a ja nie wyrabiam się z odpowiedziami.
Wpadłem na pomysł, żeby czekać na odpowiedź w pętli, jednak nie bardzo to zdaje egzamin, czasami wysyła a czasami Delhi wywala błąd że połączenie zostało „brutalnie zerwane”, tutaj fragmenty kodu źródłowego odpowiadającego za wysyłanie:
Forma główna
procedure TfrmGlowna.NapiszClick(Sender: TObject);
begin
frmNapisz.csKlientSMTP.Port:=StrToInt(Dane.PortSMTP);
frmNapisz.csKlientSMTP.Host:=Dane.AdresSMTP;
frmNapisz.csKlientSMTP.Open;
Visible:=FALSE;
frmNapisz.Visible:=TRUE;
end;
Komponenty z których korzystam
type
TfrmNapisz = class(TForm)
mTekst: TMemo;
lbOdpowiedzi: TListBox;
txtDo: TEdit;
txtTemat: TEdit;
btnWyslij: TButton;
csKlientSMTP: TClientSocket;
Button do wysyłania
procedure TfrmNapisz.btnWyslijClick(Sender: TObject);
var
i:integer;
tekst:string;
DataObecna:string;
Blad:Boolean;
begin
DataObecna:=FormatDateTime('dd',Now)+' '+Daty(FormatDateTime('mm',Now))+' '+FormatDateTime('ee hh:mm:ss',Now);
Blad:=SprawdzBlad(WyslijKomende(lbOdpowiedzi,csKlientSMTP,'helo '+Dane.AdresSMTP+#13#10,Sender),Handle);
if Blad=FALSE then
Blad:=SprawdzBlad(WyslijKomende(lbOdpowiedzi,csKlientSMTP,'AUTH LOGIN'+#13#10,Sender),Handle);
if Blad=FALSE then
Blad:=SprawdzBlad(WyslijKomende(lbOdpowiedzi,csKlientSMTP,StrTobase64(Dane.LoginPoczta) + #13#10,Sender),Handle);
if Blad=FALSE then
Blad:=SprawdzBlad(WyslijKomende(lbOdpowiedzi,csKlientSMTP,StrTobase64(Dane.HasloPoczta) + #13#10,Sender),Handle);
if Blad=FALSE then
Blad:=SprawdzBlad(WyslijKomende(lbOdpowiedzi,csKlientSMTP,'mail from: <'+Dane.AdresEmail+'>'#13#10,Sender),Handle);
if Blad=FALSE then
Blad:=SprawdzBlad(WyslijKomende(lbOdpowiedzi,csKlientSMTP,'rcpt to: <'+txtDo.Text+'>'#13#10,Sender),Handle);
if Blad=FALSE then
Blad:=SprawdzBlad(WyslijKomende(lbOdpowiedzi,csKlientSMTP,'data'#13#10,Sender),Handle);
if Blad=FALSE then
begin
Tekst:='date: '+DataObecna+#13#10+'from: '+Dane.AdresEmail+#13#10+'to: '+txtDo.Text+#13#10+'subject: '+txtTemat.Text+#13#10;
csKlientSMTP.Socket.SendText(Tekst);
Tekst:='';
for i:=0 to mTekst.Lines.Count-1 do
Tekst:=Tekst+mTekst.Lines[i]+#13#10;
csKlientSMTP.Socket.SendText(Tekst);
end;
if Blad=FALSE then
Blad:=SprawdzBlad(WyslijKomende(lbOdpowiedzi,csKlientSMTP,'.'#13#10,Sender),Handle);
if Blad=FALSE then
Blad:=SprawdzBlad(WyslijKomende(lbOdpowiedzi,csKlientSMTP,'quit'#13#10,Sender),Handle);
if Blad=FALSE then
MessageBox(Handle,'Wiadomość została wysłana','Informacja',MB_OK+MB_ICONINFORMATION);
frmGlowna.Visible:=TRUE;
Close;
Procedura do wysyłania komendy zawarta w module
function WyslijKomende(ListBox:TListBox;Klient: TClientSocket;Komenda:string;Sender: TObject):integer;
var
Kod:string[3];
Odpowiedz:string;
begin
with Klient.Socket do
begin
SendText(Komenda);
Odpowiedz:=ReceiveText;
while Odpowiedz='' do
Odpowiedz:=ReceiveText;
end;
ListBox.AddItem(Odpowiedz,Sender);
Kod:=Odpowiedz;
Result:=StrToInt(Kod)
end;
Procedura sprawdzająca kod blędu
function SprawdzBlad(Blad:integer;Uchwyt:THandle):boolean;
begin
case Blad of
211:
begin
//MessageBox(Uchwyt,'stan systemu, albo odpowiedź pomocy','Informacja',MB_OK+MB_ICONINFORMATION);
Result:=FALSE;
end;
214:
begin
//MessageBox(Uchwyt,'wiadomość pomocy','Informacja',MB_OK+MB_ICONINFORMATION);
Result:=FALSE;
end;
220:
begin
//MessageBox(Uchwyt,'serwer gotowy','Informacja',MB_OK+MB_ICONINFORMATION);
Result:=FALSE;
end;
221:
begin
//MessageBox(Uchwyt,'serwer zamyka połączenie','Informacja',MB_OK+MB_ICONINFORMATION);
Result:=FALSE;
end;
235:
begin
//MessageBox(Uchwyt,'uwierzytelnienie powiodło się','Informacja',MB_OK+MB_ICONINFORMATION);
Result:=FALSE;
end;
250:
begin
//MessageBox(Uchwyt,'potwierdzenie wykonania polecenia','Informacja',MB_OK+MB_ICONINFORMATION);
Result:=FALSE;
end;
251:
begin
//MessageBox(Uchwyt,'podany użytkownik nie znajduje się na tym serwerze; wiadomość przekierowana do <forward-path>','Informacja',MB_OK+MB_ICONINFORMATION);
Result:=FALSE;
end;
334:
begin
//MessageBox(Uchwyt,'Uwierzytelnienie','Informacja',MB_OK+MB_ICONINFORMATION);
Result:=FALSE;
end;
354:
begin
//MessageBox(Uchwyt,'początek nadawania danych pocztowych użytkownika; zakończone sekwencją <CRLF>.<CRLF>','Informacja',MB_OK+MB_ICONINFORMATION);
Result:=FALSE;
end;
421:
begin
MessageBox(Uchwyt,'serwer niedostępny, zamykanie połączenia','Błąd',MB_OK+MB_ICONERROR);
Result:=TRUE;
end;
450:
begin
MessageBox(Uchwyt,'żądana akcja nie podjęta; skrzynka pocztowa niedostępna ( lub zajęta obecnie)','Błąd',MB_OK+MB_ICONERROR);
Result:=TRUE;
end;
451:
begin
MessageBox(Uchwyt,'żądana akcja przerwana: błąd lokalny','Błąd',MB_OK+MB_ICONERROR);
Result:=TRUE;
end;
452:
begin
MessageBox(Uchwyt,'żądana akcja nie podjęta; niewystarczająca przestrzeń systemowa;','Błąd',MB_OK+MB_ICONERROR);
Result:=TRUE;
end;
500:
begin
MessageBox(Uchwyt,'błąd składni; komenda nie rozpoznana; komenda zbyt długa;','Błąd',MB_OK+MB_ICONERROR);
Result:=TRUE;
end;
501:
begin
MessageBox(Uchwyt,'błąd składni w argumentach','Błąd',MB_OK+MB_ICONERROR);
Result:=TRUE;
end;
502:
begin
MessageBox(Uchwyt,'komenda nie zaimplementowana','Błąd',MB_OK+MB_ICONERROR);
Result:=TRUE;
end;
503:
begin
MessageBox(Uchwyt,'zła kolejność komend','Błąd',MB_OK+MB_ICONERROR);
Result:=TRUE;
end;
504:
begin
MessageBox(Uchwyt,'argument komendy nie zaimplementowany','Błąd',MB_OK+MB_ICONERROR);
Result:=TRUE;
end;
535:
begin
MessageBox(Uchwyt,'Bląd uwierzytelnienia','Błąd',MB_OK+MB_ICONERROR);
Result:=TRUE;
end;
550:
begin
MessageBox(Uchwyt,'żądana akcja nie podjęta : skrzynka pocztowa niedostępna (nie znaleziona)','Błąd',MB_OK+MB_ICONERROR);
Result:=TRUE;
end;
551:
begin
MessageBox(Uchwyt,'podany użytkownik nie znajduje się na tym serwerze; spróbuj <forward-path>','Błąd',MB_OK+MB_ICONERROR);
Result:=TRUE;
end;
552:
begin
MessageBox(Uchwyt,'żądana akcja przerwana: przekroczone zasoby alokacji','Błąd',MB_OK+MB_ICONERROR);
Result:=TRUE;
end;
553:
begin
MessageBox(Uchwyt,'żądana akcja nie podjęta: zła nazwa skrzynki (błędna nazwa skrzynki)','Błąd',MB_OK+MB_ICONERROR);
Result:=TRUE;
end;
554:
begin
MessageBox(Uchwyt,'transakcja zakończona niepowodzeniem','Błąd',MB_OK+MB_ICONERROR);
Result:=TRUE;
end
else
Result:=TRUE;
end;
end;
i procedura zamykająca formę do wysyłania
procedure TfrmNapisz.FormClose(Sender: TObject; var Action: TCloseAction);
begin
csKlientSMTP.Close;
frmGlowna.Visible:=TRUE;
end;
Jeżeli ktoś zna sposób jak łatwiej czekać na odpowiedź będę wdzięczny za pomoc.
I jeszcze jedna sprawa, czy da sie w Accessie trzymać treść całego maila, czy lepiej trzymac np. link do pliku w którym jest zapisana.
Z góry dzięki za odpowiedź.