Dot-Net
我們如何使用 SmtpClient 記錄 SMTP 對話?
例如,為了進行故障排除,我需要查看來回發送的 SMTP 消息:
OUT : EHLO 機器名 IN : 250-ReallyCoolEmailServer 你好 [10.24.41.72] 在 : 250 尺寸 IN : 250-流水線 在:(……等等……) OUT : MAIL FROM: <some.address@example.com> IN : 250 <some.address@example.com>... 發件人確定…等等。
我在文件中找不到任何日誌記錄選項。在這裡我能找到的唯一問題
SmtpClient要麼不談論看到實際的對話,要麼談論使用像 WireShark 這樣的第三方工具。這似乎是一個很大的遺漏,所以我猜我只是缺少一些基本的東西。:-)
就我自己而言,我實際上更喜歡 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>但不幸的是,這產生的輸出是一個原始套接字轉儲,它遠不如 Wireshark 跟踪方便。
套接字轉儲的範例:
System.Net Verbose: 0 : [0992] SmtpClient::.ctor(host=127.0.0.1) System.Net Information: 0 : [0992] Associating SmtpClient#47606018 with SmtpTransport#5689696 System.Net Verbose: 0 : [0992] Exiting SmtpClient::.ctor() -> SmtpClient#47606018 System.Net Verbose: 0 : [0992] SmtpClient#47606018::Send(MailMessage#5138334) System.Net Information: 0 : [0992] SmtpClient#47606018::Send(DeliveryMethod=Network) System.Net Information: 0 : [0992] Associating SmtpClient#47606018 with MailMessage#5138334 System.Net Information: 0 : [0992] Associating SmtpTransport#5689696 with SmtpConnection#31950948 System.Net Information: 0 : [0992] Associating SmtpConnection#31950948 with ServicePoint#34920472 System.Net.Sockets Verbose: 0 : [0992] Socket#22453229::Socket(InterNetwork#2) System.Net.Sockets Verbose: 0 : [0992] Exiting Socket#22453229::Socket() System.Net.Sockets Verbose: 0 : [0992] Socket#22453229::Connect(1:25#16777318) System.Net.Sockets Verbose: 0 : [0992] Exiting Socket#22453229::Connect() System.Net Information: 0 : [0992] Associating SmtpConnection#31950948 with SmtpPooledStream#48167163 System.Net.Sockets Verbose: 0 : [0992] Socket#22453229::Receive() System.Net.Sockets Verbose: 0 : [0992] Data from Socket#22453229::Receive System.Net.Sockets Verbose: 0 : [0992] 00000000 : 32 32 30 20 77 32 6B 20-4D 69 63 72 6F 73 6F 66 : 220 w2k Microsof System.Net.Sockets Verbose: 0 : [0992] 00000010 : 74 20 45 53 4D 54 50 20-4D 41 49 4C 20 53 65 72 : t ESMTP MAIL Ser System.Net.Sockets Verbose: 0 : [0992] 00000020 : 76 69 63 65 2C 20 56 65-72 73 69 6F 6E 3A 20 35 : vice, Version: 5 System.Net.Sockets Verbose: 0 : [0992] 00000030 : 2E 30 2E 32 31 39 35 2E-36 37 31 33 20 72 65 61 : .0.2195.6713 rea System.Net.Sockets Verbose: 0 : [0992] 00000040 : 64 79 20 61 74 20 20 53-61 74 2C 20 33 31 20 44 : dy at Sat, 31 D System.Net.Sockets Verbose: 0 : [0992] 00000050 : 65 63 20 32 30 30 35 20-32 32 3A 31 33 3A 31 34 : ec 2005 22:13:14 System.Net.Sockets Verbose: 0 : [0992] 00000060 : 20 2D 30 36 30 30 20 0D-0A : -0600 .. System.Net.Sockets Verbose: 0 : [0992] Exiting Socket#22453229::Receive() -> 105#105 System.Net.Sockets Verbose: 0 : [0992] Socket#22453229::Send() System.Net.Sockets Verbose: 0 : [0992] Data from Socket#22453229::Send System.Net.Sockets Verbose: 0 : [0992] 00000000 : 45 48 4C 4F 20 77 32 6B-0D 0A : EHLO w2k.. System.Net.Sockets Verbose: 0 : [0992] Exiting Socket#22453229::Send() -> 10#10來源:http ://www.systemnetmail.com/faq/4.10.aspx
所以最後,不,你沒有遺漏任何東西——
SmtpClient沒有協議級別的跟踪,這確實是一個很大的遺漏。