Если я отправляю основную 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 что-то происходит, что я могу сделать лучше?