我们如何使用SmtpClient记录SMTP会话?

T.J*_*der 7 .net smtpclient

例如,为了排除故障,我需要查看哪些SMTP消息来回传输:

OUT : EHLO machinename
IN  : 250-ReallyCoolEmailServer Hello [10.24.41.72]
IN  : 250-SIZE
IN  : 250-PIPELINING
IN  : (...and so on...)
OUT : MAIL FROM: <some.address@example.com>
IN  : 250 <some.address@example.com>... Sender ok

...等等.

我没有在文档中找到任何日志记录选项.我可以找到的唯一问题SmtpClient是,不要谈论实际的转换,或谈论使用WireShark等第三方工具.

这似乎是一个相当大的遗漏,所以我猜我只是缺少一些基本的东西.:-)

Jer*_*ert 12

对于我自己来说,我实际上更喜欢像Wireshark这样的"无偏见"的外部工具来查看实际上在线的内容.SmtpClient确实有跟踪 - 它将输出发送到System.Net跟踪 - 但这包括实际通过网络传输的数据.当然,您可以System.Net.Sockets通过配置应用程序来获取它,如下所示:

<system.diagnostics>
  <sources>
    <source name="System.Net">
      <listeners>
        <add name="TraceFile"/>
      </listeners>
    </source>      
    <source name="System.Net.Sockets">
      <listeners>
        <add name="TraceFile"/>
      </listeners>
    </source>      
  </sources>
  <sharedListeners>
    <add
      name="TraceFile"
      type="System.Diagnostics.TextWriterTraceListener"
      initializeData="trace.log"
    />
  </sharedListeners>
  <switches>
    <add name="System.Net" value="Verbose"/>
    <add name="System.Net.Sockets" value="Verbose"/>
  </switches>
  <trace autoflush="true" />
</system.diagnostics>
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这产生的输出是一个原始套接字转储,它比Wireshark跟踪方便得多.

所以最后,不,你没有遗漏任何东西 - SmtpClient没有协议级别的跟踪,这确实是一个相当大的遗漏.