Использование Indy SMTP и HTTPS через DLL - PullRequest
0 голосов
/ 25 февраля 2020

Если я отправляю основную c электронную почту через TidSMTP (игнорируйте блоки try / finally, это всего лишь пример):

var
  SMTP : TidSMTP;
  MSG : TidMessage;
  LHandler : TIdSSLIOHandlerSocketOpenSSL;
begin
  SMTP := TIdSMTP.Create(nil);
  Msg := TIdMessage.Create(nil);
  LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

  Msg.Body.Text := 'Test Simple Email';
  Msg.Subject := 'Test Simple Email Subject';
  Msg.From.Address := 'test@domain.com';
  MSG.ContentType := 'text/html';
  Msg.Priority := mpHighest;

  SMTP.Host := 'smtp.server.com';
  SMTP.Username := 'test@domain.com';
  SMTP.Port := 587;
  SMTP.Password := 'testPassword';

  SMTP.IOHandler := LHandler;

  try
    with Msg.Recipients.Add do
    begin
      Address := 'test@domain.com'
    end;
    try
      SMTP.Connect;
      SMTP.Send(Msg);
      SMTP.Disconnect;
    finally
      Screen.Cursor := crDefault;
    end;
  finally
    LHandler.Free;
    Msg.Free;
    SMTP.Free;
  end;

И затем вызывайте DLL, которая делает HTTPS-запрос через TidHTTP :

var
  myHTTP : TIdHTTP;
  LHandler: TIdSSLIOHandlerSocketOpenSSL;
  FJSON : String;
  GetStr : String;
begin
  GetStr := URLEncode('6421 E ROAD, GREELEY,CO,80634');
  GetStr := 'https://maps.googleapis.com/maps/api/geocode/json?address=' + GetStr + '&key=' + 'someGoogleAPIKey';

  myHTTP := TIdHTTP.Create(nil);
  try
    LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    try
      LHandler.SSLOptions.SSLVersions := [sslvTLSv1_2];
      myHTTP.IOHandler := LHandler;
      try
        FJSON := myHTTP.Get(GetStr);
      except
        on E: Exception do
        begin
          raise
        end;
      end;

      showmessage(FJSON);
    finally
      LHandler.Free;
    end;
  finally
    myHTTP.Free;
  end;

И затем попробуйте электронную почту во второй раз, я получаю сообщение об ошибке «Ошибка создания контекста SSL», а именно: «Ошибка: 140A90F1: Подпрограммы SSL: SSL_CTX_new: невозможно загрузить подпрограммы ssl2 md5»

Если я слегка изменю это, введя компонент TidSMTP в метод TidSSLIOHandlerSocketOpenSSL Create:

  LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
  ...
  //SMTP.IOHandler := lHandler;

Тогда это сработает. Но я не могу это использовать. Это полностью урезанная версия проблемы. На самом деле я использую ReportBuilder (цифровые метафоры) для отправки электронной почты, и они не позволяют отправлять в TidSMTP во время метода Create TidSSLIOHandlerSocketOpenSSL Create.

Эта ошибка не возникает, когда запрос HTTPS выполняется в той же программе, что и запрос SMTP. Только при переходе в DLL. Эта ошибка не происходит, если я сначала делаю HTTPS / DLL, а затем SMTP. Во время первого вызова SMTP происходит что-то, что настраивает на ошибку в будущем.

Должен ли я передать это цифровым метафорам, или во время вызова HTTPS / DLL что-то происходит, что я могу сделать лучше?

...