很久以前我写了下面的代码来从邮箱中检索电子邮件:
pop3 := TNMPOP3.Create(Self);
try
pop3.Host := FAppSettings.ServerName;
pop3.Port := FAppSettings.ServerPort;
pop3.UserID := FAppSettings.Login;
pop3.Password := FAppSettings.Password;
try
pop3.Connect;
except
on E:Exception do AddError(E.Message);
end;
if not pop3.Connected then Exit;
if pop3.MailCount > 0 then begin
pop3.DeleteOnRead := False;
pop3.AttachFilePath := GetTempDirectory;
ProcessMsgs(pop3);
end
else begin
TCommon.InfMsg('There are no messages in mailbox');
end;
pop3.Disconnect;
finally
pop3.Free;
end;
现在,当邮件服务提供商完全切换到 SSL 时,这段代码显然失败了,但是以一种奇怪的方式:
pop3.Connect
行导致异常,但 E.Message 中的文本为空,使得最终用户不清楚问题。
对 Delphi 调试器中问题的调查显示,第一次生成正确的异常:
Project .... raised exception class Exception with message 'Authentication failed'.
但是,当我再次按下 F8(Step Over)时,执行点仍然在同一行并且生成了另一个异常:
Project .... raised exception class Exception with message ''.
只有这个异常被try-except
捕获。
为什么?
最佳答案
要回答您“为什么?”的实际问题,您描述的序列意味着 TNMPOP3.Connect()
在内部捕获原始身份验证异常并抛出一个新的异常而不显示错误消息。这是错误还是故意的,如果不查看 TNMPOP3
的源代码,就无法知道。 Delphi 没有附带那个源代码,而且 NetMasters 已经不在了,所以你不能向他们索取。 TNMPOP3
无论如何都不支持 SSL,因此您将不得不切换到另一个组件/库来处理您的 POP3+SSL 功能。
关于delphi - TNMPOP3.Connect 生成两次异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25956564/