Delphi + Indy - ssl negotiation failed

Delphi + Indy - ssl negotiation failed
J0
  • Rejestracja:prawie 5 lat
  • Ostatnio:3 dni
  • Postów:75
0

Cześć
Mam zrobioną wysyłkę maili gdzie wykorzystuje konta mailowe GMAIL. Sytuacja jest taka, że na komputerze gdzie mam projekt to wszystko działa poprawnie ale gdy uruchamiam program na innym komputerze to przy próbie wysłania maila otrzymują błąd "SSL negotiation failed".
Wyczytałem, że w katalogu gdzie jest program powinny być pliki "ssleay32.dll" oraz "libeay32.dll" ale nawet po umieszczeniu tych plików błąd nadal występuje.
Czy coś jeszcze jest wymagane aby wysyłka działała na każdym komputerze?

Kod:

Kopiuj
mailFrom := [moj adres GMAIL]
  with idsmtpGMAIL do
  begin
    Host := 'smtp.gmail.com';
    Password := [Hasło]
    port := 587;
    Username := mailFrom;
    UseTls := utUseExplicitTLS;
  end;
  sslHandler1.Destination := idsmtpGMAIL.Host + ':587';
  sslHandler1.Host := idsmtpGMAIL.Host;
  sslHandler1.SSLOptions.Method := sslvTLSv1_2;
  sslHandler1.SSLOptions.SSLVersions := [sslvTLSv1_2];
  with idmsgSend do
  begin
    body.Clear;
    body.Append('TEST wiadomości.');
    Recipients.EMailAddresses := [adresat]
    Subject := 'TEST';
    From.Name := 'GMAIL';
    From.Address := mailFrom;
  end;
  idsmtpGMAIL.IOHandler := sslHandler1;
  idsmtpGMAIL.Connect;

  if idsmtpGMAIL.Connected then
  begin
    try
      try
        idsmtpGMAIL.Send(idmsgSend);
        Showmessage('Mail został wysłany!');
      except
        on e: exception do
          Showmessage(e.Message);
      end;
    finally
      idsmtpGMAIL.Disconnect();
    end;
  end;
edytowany 6x, ostatnio: flowCRANE
JB
ZK
  • Rejestracja:około 6 lat
  • Ostatnio:5 dni
  • Postów:6
1

na każdym kompie wraz ze swoim exe musisz dostarczyć dwie dllki: libeay32.dll i ssleay32.dll.
Ja mam tak na delphi XE + indy

Kopiuj
var
  IdSMTP1: TIdSMTP;
  IdMsg: TIdMessage;
  EXT:string;
  i,ii:Integer;
  SSLHandler:TIdSSLIOHandlerSocketOpenSSL;
  IdUserPassProv1: TIdUserPassProvider;

  IdSASLLogin1: TIdSASLLogin;
  IdSASLCRAMMD5: TIdSASLCRAMMD5;
  IdSASLCRAMSHA1: TIdSASLCRAMSHA1;
  IdSASLPlain: TIdSASLPlain;
  IdSASLLogin: TIdSASLLogin;
  IdSASLSKey: TIdSASLSKey;
  IdSASLOTP: TIdSASLOTP;
  IdSASLAnonymous: TIdSASLAnonymous;
  IdSASLExternal: TIdSASLExternal;
  Enc : iIdTextEncoding;

begin

  IdOpenSSLSetLibPath(ExtractFilePath(ParamStr(0)));

  IdSMTP1:=TIdSMTP.Create(nil);
  IdMsg:=TIdMessage.Create(nil);
  IdSMTP1.Host:=EmailSMTP;
  IdSMTP1.Port:=EmailNrPortu;
  if SSLrequired then
  begin
    TIdSSLContext.Create.Free;
    SSLHandler:=TIdSSLIOHandlerSocketOpenSSL.Create(IdSMTP1);
    SSLHandler.onStatusInfo:=ssl1StatusInfo;
    case SSLMethod of
     0:SSLHandler.SSLOptions.Method:= sslvTLSv1;
     1:SSLHandler.SSLOptions.Method := sslvSSLv2;
     2:SSLHandler.SSLOptions.Method := sslvSSLv23;
     3:SSLHandler.SSLOptions.Method := sslvSSLv3;
     4:SSLHandler.SSLOptions.Method := sslvTLSv1_1;
     5:SSLHandler.SSLOptions.Method := sslvTLSv1_2;
    end;
    SSLHandler.SSLOptions.Mode := sslmClient;

    IdSMTP1.IOHandler := SSLHandler;

    if (IdSMTP1.port = 465) then
        IdSMTP1.UseTLS := utUseImplicitTLS
    else
        IdSMTP1.UseTLS := utUseExplicitTLS;

    IdSASLLogin1:=TIdSASLLogin.Create(IdSMTP1);
    IdUserPassProv1:=TIdUserPassProvider.Create(IdSMTP1);
    IdUserPassProv1.Password:=trim(EmailHasloKonta);
    IdUserPassProv1.Username:=trim(EmailNazwaKonta);

    IdSMTP1.AuthType:=satSASL;
    IdSASLCRAMSHA1 := TIdSASLCRAMSHA1.Create(idSMTP1);
    IdSASLCRAMSHA1.UserPassProvider := IdUserPassProv1;
    IdSASLCRAMMD5 := TIdSASLCRAMMD5.Create(idSMTP1);
    IdSASLCRAMMD5.UserPassProvider := IdUserPassProv1;
    IdSASLSKey := TIdSASLSKey.Create(idSMTP1);
    IdSASLSKey.UserPassProvider := IdUserPassProv1;
    IdSASLOTP := TIdSASLOTP.Create(idSMTP1);
    IdSASLOTP.UserPassProvider := IdUserPassProv1;
    IdSASLAnonymous := TIdSASLAnonymous.Create(idSMTP1);
    IdSASLExternal := TIdSASLExternal.Create(idSMTP1);
    IdSASLLogin := TIdSASLLogin.Create(idSMTP1);
    IdSASLLogin1.UserPassProvider:=IdUserPassProv1;
    IdSASLPlain := TIdSASLPlain.Create(idSMTP1);
    IdSASLPlain.UserPassProvider := IdUserPassProv1;

    IdSMTP1.SASLMechanisms.Add.SASL := IdSASLCRAMSHA1;
    IdSMTP1.SASLMechanisms.Add.SASL := IdSASLCRAMMD5;
    IdSMTP1.SASLMechanisms.Add.SASL := IdSASLSKey;
    IdSMTP1.SASLMechanisms.Add.SASL := IdSASLOTP;
    IdSMTP1.SASLMechanisms.Add.SASL := IdSASLAnonymous;
    IdSMTP1.SASLMechanisms.Add.SASL := IdSASLExternal;
    IdSMTP1.SASLMechanisms.Add.SASL := IdSASLLogin1;
    IdSMTP1.SASLMechanisms.Add.SASL := IdSASLPlain;   
  end;
edytowany 1x, ostatnio: ZenonKlamka
J0
  • Rejestracja:prawie 5 lat
  • Ostatnio:3 dni
  • Postów:75
0
ZenonKlamka napisał(a):

na każdym kompie wraz ze swoim exe musisz dostarczyć dwie dllki: libeay32.dll i ssleay32.dll

Ja mam te dwa pliki umieszczone, ale mimo to wciąż błąd "SSL negotiation failed" występuje.error.png
obraz.png

J0
  • Rejestracja:prawie 5 lat
  • Ostatnio:3 dni
  • Postów:75
0

Wydaje mi się, że w końcu mi się udało rozwiązać problem. Widocznie te biblioteki "ssleay32.dll" oraz "libeay32.dll" miałem jakieś nieprawidłowe bo ściągnąłem inne z tej lokalizacji https://wiki.overbyte.eu/arch/openssl-1.0.2u-win32.zip i teraz działa na każdym testowanym komputerze.
Stare biblioteki były z 2017 i 2019 roku. Te nowe są z 2020 roku i działają.

edytowany 1x, ostatnio: jm0x01
ZK
  • Rejestracja:około 6 lat
  • Ostatnio:5 dni
  • Postów:6
0

ssldll.zip

ja używam te dll

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.