很久以前我写了以下代码来检索邮箱中的电子邮件:
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 ....引发异常类异常,消息'身份验证失败'。
然后,当我再次按F8(Step Over)时,执行点仍然在同一行,并产生另一个异常:
Project ....使用消息''。
引发异常类异常
并且try-except
只捕获此异常。
为什么?
答案 0 :(得分:2)
要回答“为什么?”的实际问题,您描述的序列意味着TNMPOP3.Connect()
在内部捕获原始身份验证异常并抛出新异常而不显示错误消息。无论是错误还是故意,如果不查看TNMPOP3
的源代码,就无法知道。 Delphi没有提供该源代码,NetMaster不再存在,所以你不能要求它们。 TNMPOP3
无论如何都不支持SSL,因此您必须切换到另一个组件/库来处理您的POP3 + SSL功能。