我想在我的SMTPServer.OnConnect
事件中发送错误消息(当然直接转到OnDisconnect
事件)给客户端,我希望看起来像gmail暂时阻止ip消息: 421," 4.7.0",我们的系统检测到源自您的IP地址的不请自来邮件的异常率。为了保护我们的用户免受垃圾邮件的侵扰,您的IP地址发送的邮件已被暂时阻止。查看我们的批量电子邮件发件人指南。这是我尝试这样做的方式:
procedure TMainForm.SMTPServerConnect(AContext: TIdContext);
var
errMess : String;
begin
if ipTemporaryBanned(AContext.Binding.PeerIP) then begin
AContext.Connection.IOHandler.WriteLn('421 ' + 'IP temporary banned.');
raise Exception.Create('IP temporary banned.');
end;
end;
如果我使用TIdSMTP
组件没有问题 - 我在try .. except
块中捕获错误,但当我使用其他邮件客户端时 - 如Mozilla Thunderbird
- 我无法收到错误正在发送的消息 - 它只是说&#SMTP;与SMTP服务器的连接超时。'
如何发送错误以便所有邮件客户端都可以读取它?
答案 0 :(得分:3)
您无法控制客户端如何处理来自服务器的错误。客户有责任检测来自服务器的错误并采取相应措施,但他们没有义务报告服务器的错误消息。用户,他们可以自由地做任何他们想做的事。在服务器端,你无能为力。您所能做的就是发送错误消息,并希望客户端至少具有日志记录功能,以便用户可以根据需要搜索错误消息。
话虽如此,我建议您在错误消息中包含扩展回复代码(就像GMail一样),因此识别扩展代码的客户端至少会知道错误是临时的和与安全相关的:
AContext.Connection.IOHandler.WriteLn('421 4.7.0 IP temporary banned.');