5

目前我正在测试 Ararat Synapse 在 Delphi 中发送电子邮件。

本地函数创建 TSMTPSend 并发送电子邮件。
如何中止此操作? 我设置了一个分配给 SMTP.Sock.OnStatus 的回调函数来执行一些状态输出。
当我想中止发送进度时,我想我可以在回调函数中使用 TSMTPSend 的 TTCPBlockSocket,因为在这个函数中我无法直接访问 TSMTPSend。

我想做的看起来基本上像

MyCallBack(Sender: TObject; Reason: THookSocketReason; const Value: string);
begin
  if FCancelWasClicked then
  begin
    if Sender is TTCPBlockSocket then
      TTCPBlockSocket(Sender).StopFlag := True;
      // or TTCPBlockSocket(Sender).AbortSocket or CloseSocket
  end;
end;

但是 StopFlag 没有显示任何效果,并且 AbortSocket/ CloseSocket 会导致 StackOverFlow,因为套接字将无休止地发送 HR_CloseSocket 消息。

我做错了吗?还有其他选择吗?

4

1 回答 1

6

Synapse 提供了一个心跳函数,它允许实现 Cancel 行为。

http://www.ararat.cz/synapse/doku.php/public:howto:heartbeat

处理 OnHeartbeat 事件,将 HeartbeatRate 属性设置为心跳之间的间隔,并设置 StopFlag 以取消操作。

于 2013-02-20T11:50:56.733 回答