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ź.