Email Indy 10 smtp身份验证引发访问冲突
Iam使用最近从下载的Delphi 5和Indy 10。 当提供的凭据不正确时,将发生访问冲突错误。验证函数似乎产生了错误。 也不可能越过访问冲突错误,导致程序在没有任何警告的情况下关闭。 下面是一个示例代码:Email Indy 10 smtp身份验证引发访问冲突,email,delphi,authentication,smtp,indy,Email,Delphi,Authentication,Smtp,Indy,Iam使用最近从下载的Delphi 5和Indy 10。 当提供的凭据不正确时,将发生访问冲突错误。验证函数似乎产生了错误。 也不可能越过访问冲突错误,导致程序在没有任何警告的情况下关闭。 下面是一个示例代码: procedure TForm1.Button2Click(Sender: TObject); var IDSMTP1: TIdSMTP; Idmessage1: TIDMessage; IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSock
procedure TForm1.Button2Click(Sender: TObject);
var IDSMTP1: TIdSMTP;
Idmessage1: TIDMessage;
IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
begin
IDSMTP1 := TIdSMTP.Create;
IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create;
try
with IDSMTP1 do begin
Host := 'smtp.gmail.com';
Port := 465;
Username := 'email@gmail.com';
Password := 'password';
AuthType := satDefault;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLVersions := [sslvTLSv1];
IOHandler := IdSSLIOHandlerSocketOpenSSL1;
UseTLS := utUseRequireTLS;
end;
Idmessage1 := TIDMessage.Create;
try
with Idmessage1 do begin
Subject := 'test';
From.Address := 'email@gmail.com';
From.Name := 'testname';
Recipients.EMailAddresses := 'email@gmail.com';
end;
with IDSMTP1 do begin
if not Connected then
Connect;
try
Authenticate;
Send(IdMessage1);
except
end;
Disconnect;
end;
finally
Idmessage1.Free;
end;
finally
IDSMTP1.Free;
IdSSLIOHandlerSocketOpenSSL1.Free;
end;
end;
提前谢谢。我已经用Gmail测试了很多次TIdSMTP,所以我知道它是有效的,除非这是Delphi5特有的bug(这不是第一次)。当错误发生时,调试器为调用堆栈显示了什么?我可能知道什么失败了,但我需要检查代码。至于“不可能过去”,那根本不是真的。
try/except
可以捕获访问冲突。您的代码只使用了try/finally
,它不会捕获异常。但是,即使您没有捕获它,您的代码也在UI事件处理程序中,因此VCL消息循环将捕获异常。您的应用程序不应终止。是的,这是一个已知的Delphi 5错误(与调用具有开放数组参数的重载方法时的调用堆栈损坏有关,这是Authenticate
内部执行的操作)。此错误已在Delphi6中修复。Delphi5中的一个解决方法是在启用堆栈帧和禁用优化的情况下重新编译Indy,但这并不总是有效的。我确实有一个代码修复程序,但它真的很难看,所以我还没有检查它,我需要找到一个更干净的解决方案,不会破坏与更高版本的兼容性。感谢您的回复。我在Connect
之后使用了try/except
,还尝试用except
替换最后的。