2017-01-16 124 views
1

我一直在使用的演示用Delphi 7.一切正常擺弄SMTP客戶端和服務器組件在印第安納波利斯9。但是,當我登錄服務器時,演示僅顯示電子郵件主題和郵件正文,From:To:字段未顯示。印SMTP服務器和Telnet

下面的代碼顯示了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; 

有人可以提出一個理由嗎? 首先,感謝雷米的迴應。 其次,看來我不能在這裏發表圖片,然而,但這裏是服務器的telnet會話https://postimg.org/image/f0n9j0kcx/的圖片的鏈接。 telnet會話顯示服務器響應。 也感謝提醒我關於Wireshark以及使用TIdLog組件的建議。

+0

歡迎來到StackOverflow。請顯示您通過Telnet發送的實際命令,您可能會丟失一些東西。 –

+0

如何發佈我的Telnet會話的圖像?它是否在評論中出現在這裏,還是我點擊「回答你的問題」? – grasshopper

+0

如果您從終端窗口複製/粘貼實際的命令,而不是張貼圖像,會更好。但無論哪種方式,請[編輯您的問題](http://stackoverflow.com/posts/41686677/edit)以包含新信息,請勿將其發佈在答案或評論中。 –

回答

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事件)的任何電子郵件地址傳遞給OnReceive...事件在RCPT參數,並在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控件,這是不安全的並且可能導致各種問題。只要同步的代碼運行在上下文中,您可以使用VCL的TThread.Synchronize()TThread.Queue()方法或Indy的TIdSyncTIdNotify類或您選擇的任何其他線程安全同步機制與主UI線程同步必須只有主UI線程。