1

我一直在使用带有 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;

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

4

1 回答 1

1

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

MAIL FROM通过命令接收并被服务器接受(参见事件)的任何电子邮件地址都将OnCommandMail传递给属性中的OnReceive...事件TIdSMTPServerThread(ASender.Thread).FromRCPT TO如果从一开始就没有接受电子邮件地址,服务器将不会接受命令MAIL FROM。如果您不分配OnCommandMail处理程序,服务器将接受它收到的任何电子邮件地址。

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

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

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

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

于 2017-01-17T00:44:02.427 回答