2017-01-16 20 views
1

私はDelphi 7でデモを使用してIndy 9のSMTPクライアントとサーバーコンポーネントについてだまされています。すべてうまくいきます。ただし、サーバーにtelnetすると、メールの件名とメールの本文のみが表示され、From:To:のフィールドは表示されません。Indy 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; 

誰かが理由を示唆できますか? まずはレミーに感謝しています。 第2に、ここに画像を投稿できないようですが、ここにはserver-telnetセッションhttps://postimg.org/image/f0n9j0kcx/の画像へのリンクがあります。 telnetセッションには、サーバーの応答が表示されます。 Wiresharkに関するTIの思い込みと、TIdLogコンポーネントの使用を提案してくれてありがとう。

+0

ようこそStackOverflow。 Telnet経由で送信している実際のコマンドを表示してください。何か不足している可能性があります。 –

+0

私のTelnetセッションの画像を投稿するには?それはコメントの中でここに行きますか、または「あなたの質問に答えてください」をクリックしますか? – grasshopper

+0

イメージをポストするのではなく、ターミナルウィンドウから実際のコマンドをコピー/ペーストする方がよいでしょう。しかしどちらの方法でも、新しい情報を含めるには[edit your question](http://stackoverflow.com/posts/41686677/edit)してください。回答やコメントに投稿しないでください。 –

答えて

1

Telnet経由で送信している実際のSMTPコマンドを表示していないのに、TIdSMTPが送信する必要なコマンド/データが不足している可能性が高いことを確認するのは難しいことです。交換されている実際のSMTPコマンド/応答を確認するには、Wiresharkのようなパケットスニファを使用するか、IndyのTIdLog...コンポーネントの1つをTIdSMTPおよび/またはTIdSMTPServerソケット接続に接続します。

MAIL FROMコマンドを介して受信し、サーバーによって受け入れられている任意のメールアドレスは(OnCommandMailイベントを参照してください)TIdSMTPServerThread(ASender.Thread).FromプロパティでOnReceive...イベントに渡されます。電子メールアドレスが最初にMAIL FROMから受け入れられていない場合、サーバーはRCPT TOコマンドを受け入れません。 OnCommandMailハンドラを割り当てない場合、サーバーは受け取った電子メールアドレスを受け入れます。

RCPT TOコマンドを介して受信し、サーバーによって受け入れられている任意のメールアドレスは(OnCommandRCPTイベントを参照してください)RCPTパラメータであり、またTIdSMTPServerThread(ASender.Thread).RCPTList財産でOnReceive...イベントに渡されます。少なくとも1つの電子メールアドレスが最初に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のTIdSyncまたはTIdNotifyクラス、または選択したその他のスレッドセーフ同期メカニズムを使用して、メインUIスレッドと同期する必要があります。ただし、同期コードがメインのUIスレッドのみ。

関連する問題