【问题标题】:Indy SMTP Server and TelnetIndy SMTP 服务器和 Telnet
【发布时间】:2017-01-16 23:27:18
【问题描述】:

我一直在使用 Delphi 7 的演示来玩弄 Indy 9 中的 SMTP 客户端和服务器组件。一切正常。但是,当我 telnet 进入服务器时,演示只显示电子邮件主题和邮件正文,From:To: 字段没有显示。

下面的代码显示AMsg缺少相关数据。

procedure TForm1.IdSMTPServer1ReceiveMessageParsed(ASender: TIdCommand;
  var AMsg: TIdMessage; RCPT: TIdEMailAddressList;
  var CustomError: String);
begin
  // This is the main event if you have opted to have the idSMTPServer to do your parsing for you.

  // The AMessage contains the completed TIdMessage.

  // NOTE: Dont forget to add IdMessage to your USES clause!

  ToLabel.Caption := AMsg.Recipients.EMailAddresses;
  FromLabel.Caption := AMsg.From.Text;
  SubjectLabel.Caption := AMsg.Subject;
  Memo1.Lines := AMsg.Body;

  // Implement your file system here :)
end;

任何人都可以提出一个理由吗? 首先,感谢雷米的回复。 其次,我似乎还不能在这里发布图片,但这里是服务器远程登录会话图片的链接https://postimg.org/image/f0n9j0kcx/。 telnet 会话显示服务器响应。 也感谢您提醒我有关 Wireshark 以及使用 TIdLog 组件的建议。

【问题讨论】:

  • 欢迎来到 StackOverflow。请显示您通过 Telnet 发送的实际命令,您可能遗漏了什么。
  • 如何发布我的 Telnet 会话的图像?它是在评论中出现,还是我点击“回答您的问题”?
  • 最好从终端窗口复制/粘贴实际命令,而不是发布图像。但无论哪种方式,请edit your question 包含新信息,不要在答案或评论中发布。

标签: delphi delphi-7 indy indy-9


【解决方案1】:

很难确定,因为您没有显示您通过 Telnet 发送的实际 SMTP 命令,但您可能缺少TIdSMTP 发送的必需命令/数据。要查看正在交换的实际 SMTP 命令/响应,您可以使用像 Wireshark 这样的数据包嗅探器,或将 Indy 的 TIdLog... 组件之一附加到 TIdSMTP 和/或 TIdSMTPServer 套接字连接。

通过MAIL FROM 命令接收并被服务器接受(请参阅OnCommandMail 事件)的任何电子邮件地址都将传递给TIdSMTPServerThread(ASender.Thread).From 属性中的OnReceive... 事件。如果电子邮件地址未首先从MAIL FROM 接受,服务器将不接受RCPT TO 命令。如果您不分配 OnCommandMail 处理程序,服务器将接受它收到的任何电子邮件地址。

通过RCPT TO 命令接收并被服务器接受(请参阅OnCommandRCPT 事件)的任何电子邮件地址都将传递到RCPT 参数中的OnReceive... 事件,以及TIdSMTPServerThread(ASender.Thread).RCPTList 属性中.如果至少有一个电子邮件地址未被首先从RCPT TO 接受,则服务器将不接受DATA 命令。如果您不分配 OnCommandRCPT 处理程序,服务器将接受它收到的每个电子邮件地址。

OnReceiveMessage... 事件中,提供的TIdMessage 对象首先由仅在DATA 命令中发送的原始电子邮件数据填充。仅在 OnReceiveMessageParsed 事件的情况下,如果之前通过 RCPT TO 接受的任何电子邮件地址不存在,它们将被合并到 TIdMessage.Recipients 属性中。但是,MAIL FROM 命令中收到的任何电子邮件地址都不会合并到TIdMessage.From 属性中。

因此,根据您在DATA 命令中实际发送的电子邮件数据,AMsg.From 属性可能为空,也可能不为空。但AMsg.Recipients 属性当然不应该。

另外,还有一点要记住——TIdSMTPServer 是多线程的(就像大多数 Indy 服务器一样)。它的事件在工作线程的上下文中触发,而不是在主 UI 线程中触发。您的代码直接从主 UI 线程外部访问 VCL UI 控件,这是不安全的,可能会导致各种问题。您必须与主 UI 线程同步,使用 VCL 的 TThread.Synchronize()TThread.Queue() 方法,或 Indy 的 TIdSyncTIdNotify 类,或您的任何其他线程安全同步机制选择,只要同步的代码仅在主 UI 线程的上下文中运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2013-09-03
    • 2017-10-09
    • 1970-01-01
    • 2013-11-10
    • 2011-01-27
    相关资源
    最近更新 更多