Nawiazanie polaczenia z pocztą e-mail przez proxy

0

Witam
Próbuję zrobić klienta poczty e-mail, korzystając z pakietu komponentów indy9, problem w tym, że jestem w sieci firmowej, która łączy się z internetem przez proxy. Poszedłem w kierunku komponentów:
IdSMTP: TIdSMTP;
IdSocksInfo: TIdSocksInfo;
IdIOHandlerSocket: TIdIOHandlerSocket;

Wywołanie metody powoduje zawiesznie się aplikacji, może mój sposób jest błędny?

 Procedure Polacz;
 begin   
   idSMTP.Username:='[email protected]';
   idSMTP.Password:='hasloXXXXX';
   idSMTP.Host:='smtp.wp.pl';
   idSMTP.Port:=465;
   idSMTP.AuthenticationType:= atLogin;

   idSocksInfo:=TIdSocksInfo.Create(idSMTP.Socket);
   idSocksInfo.Host:='10.1.0.XXX';
   idSocksInfo.Port:=3XXX;
   idSocksInfo.Username:='loginXXXXXX';
   IdSocksInfo.Password:='hasloXXXXX';
   idSocksInfo.Authentication:=saUsernamePassword;
   idSocksInfo.Version:=svSocks5;     

   idIOHandlerSocket.SocksInfo:=IdSocksInfo;
   idSMTP.IOHandler:=IdIOHandlerSocket;

   try
     idSMTP.Connect(-1);
   finally
     if idSMTP.Connected then 
       idSMTP.Disconnect;
   end;
 end;
0
  1. Skoro server się łączy już z proxy w firmie to po co osobo łączyć aplikację (wszystko przechodzi przez serwer bez potrzeby nawiązywania nowego połączenia)
  2. Prot 465 to szyfrowany (SSL) nie mam pewności co do obsługi tego przez Indy9
  3. Nie rozumiem tego działania
   if idSMTP.Connected then 
       idSMTP.Disconnect;

jak jesteś połączony to się rozłączasz ?

0

a i po **uj ci -1 w tym idSMTP.Connect(-1);

0
proqix polaczerq napisał(a)
  1. Skoro server się łączy już z proxy w firmie to po co osobo łączyć aplikację (wszystko przechodzi przez serwer bez potrzeby nawiązywania nowego połączenia)
  2. Prot 465 to szyfrowany (SSL) nie mam pewności co do obsługi tego przez Indy9
  3. Nie rozumiem tego działania
   if idSMTP.Connected then 
       idSMTP.Disconnect;

jak jesteś połączony to się rozłączasz ?

  1. Poniewaz bez ustawienia proxy wywala mi bład error socket #10061.
  2. Na porcie 587 - bez SSL, dla poczty o2 również to samo.
  3. Normalne roząłaczenie po wykonaniu zadania, na cele testowe wykomentowane, niestety do tego momentu nie dochodzi, zawiesza się na Connect i dalej nie idzie, nawet nie mogę okna formatki przesunąć.
0
wwu napisał(a)

a i po **uj ci -1 w tym idSMTP.Connect(-1);

A po to żebyś się pytał, a tak na serio to parametr określający czas na odpowiedź (dla -1 jest nieograniczony), na cele testowe sobie wpisałem -1, wolno mi.

0

Nie wiem po co to proxy (czy jest konieczne) ale nim tym zaczniesz się "bawić" napisz poprawne łączenie się bez tego proxy (i wypróbuj czy przypadkiem nie zadziała w tej sieci firmowej)
Nie mam Indy 9 ale u mnie w Indy 10 wygląda to tak:

begin
  IdSMTP.Username:= '[email protected]';
  IdSMTP.Password:= 'xxxx';
  IdSMTP.Host:= 'smtp.wp.pl';
  IdSMTP.Port:= 587;
  IdSMTP.AuthType:= atDefault; //(na atNone tez dziala) w Indy 10 nie ma atLogin
  if not IdSMTP.Connected then
  try
  IdSMTP.Connect;
  try
  //tu cos mozna robic
  ShowMessage('polaczony');
  finally
    if IdSMTP.Connected then
      IdSMTP.Disconnect;
  end;
  except
    on E: Exception do
      Application.MessageBox(PAnsiChar(E.Message), 'Test SMTP', MB_ICONERROR);
  end;
end;

Łączę się bez SSL, bo coś mi nie wychodzi (objawy jak u Ciebie) a nie mam czasu teraz kombinować (z GMail po TLS łączy bez problemu)

EDIT//
Połączenie z SSL wygląda tak (właściwie jest to kod uniwersalny z SSL i bez wystarczy zmienić port):

procedure TForm1.btnConnectClick(Sender: TObject);
begin
  IdSMTP.Username:= '****@wp.pl';
  IdSMTP.Password:= '****';
  IdSMTP.Host:= 'smtp.wp.pl';
  IdSMTP.Port:=  465; //dla SSL (587 bez SSL)
  IdSMTP.AuthType:= atDefault;
  if (IdSMTP.Port = 465)then //bedzie polaczenie z ssl
  begin
    IdSMTP.IOHandler:= TIdSSLIOHandlerSocketOpenSSL.Create(IdSMTP);
    IdSMTP.UseTLS:= utUseImplicitTLS;
  end
  else
    IdSMTP.IOHandler:= nil;

  if (not IdSMTP.Connected) then
  try
  IdSMTP.Connect;
  try
  //tu cos mozna robic
  ShowMessage('polaczony');
  finally
    if IdSMTP.Connected then
      IdSMTP.Disconnect;
  end;
  except
    on E: Exception do
      Application.MessageBox(PAnsiChar(E.Message), 'Test SMTP', MB_ICONERROR);
  end;
end;

Oczywiscie wymaga bibliotek openssl (ssleay32.dll i libeay32.dll)

0

Kod ogólnie działa ok na wp czy na o2, lecz na ovh są problemy, @kAzek pomożesz?

Hostname=ssl0.ovh.net
Port=465
0

Co to znaczy nie działa nie loguje czy co? Poza tym jak chcesz pomocy musisz utworzyć jakieś tymczasowe konto e-mail na tym OVH i dać mi dane.

0

Bez problemu działa ten kod:

  IdSMTP.Username:= '[email protected]';
  IdSMTP.Password:= 'haslo';
  IdSMTP.Host:= 'ssl0.ovh.net';
  IdSMTP.Port:=  465; //dla SSL (587 bez SSL)

  IdMessage.From.Name := 'nazwa nadawcy';
  IdMessage.From.Address := '[email protected]';
  IdMessage.Recipients.EMailAddresses := '[email protected];';
  IdMessage.CharSet:= 'UTF-8';
  IdMessage.ContentType:= 'text/html; charset=UTF-8';
  IdMessage.Subject := 'temat ąćęłńóśźż :)';
  IdMessage.Body.Append('treść maila ąćęłńóśźż');

  IdSMTP.AuthType:= satDefault;
  if (IdSMTP.Port = 465)then //bedzie polaczenie z ssl
  begin
    IdSMTP.IOHandler:= TIdSSLIOHandlerSocketOpenSSL.Create(IdSMTP);
    IdSMTP.UseTLS:= utUseImplicitTLS;
  end
  else
    IdSMTP.IOHandler:= nil;

  try
    IdSMTP.Connect;
    try
      IdSMTP.Send(IdMessage);
    finally
      if IdSMTP.Connected then
        IdSMTP.Disconnect;
    end;
  except
    on E: Exception do
      Application.MessageBox(PChar(E.Message), 'Test SMTP', MB_ICONERROR);
  end
0

Dzięki, naprowadziło mnie to na sprawdzenie typu kontentu wiadomosci.
Generalnie problem polegał na tym, ze na sztywno ustawiane było:

ContentType := 'multipart/alternative';

z powodu takiego, ze wiadomosc mogla byc z zalacznikiem lub bez...

Odpowiednie operowanie tym parametrem zalatwia sprawe...
(Delphi Berlin)

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