我正试图解决导致SMTP服务器的奇怪问题,该问题通常用于为我自己的电子邮件地址返回“未知收件人”消息。在生产环境中,我使用其他SMTP服务器,因此这只会阻止我的测试。
我试图使用Fiddler分析流量,但显然Fiddler并未检测到任何SMTP流量。我没有接受过WireShark的培训,这只是一个很小的项目,我不能花很多时间,所以我认为我只是将一个小型TCP服务组合在一起,而不是只是看看我使用的SmtpClient实例正在发送什么
这是TcpListener代码...
class Service
{
public Task Listen(int port, CancellationToken ct, TcpHandler tcpHandler = null)
{
tcpHandler = tcpHandler ?? defaultTcpHandler;
return Task.Run(async () =>
{
var endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);
var listener = new TcpListener(endpoint);
listener.Start();
try
{
while (!ct.IsCancellationRequested)
{
var client = await listener.AcceptTcpClientAsync();
handleRequestAsync(client, tcpHandler, ct);
}
listener.Stop();
}
catch (SocketException ex)
{
Console.WriteLine($"SocketException: {ex}");
}
finally
{
listener.Stop();
}
},
ct);
}
void handleRequestAsync(TcpClient client, TcpHandler tcpHandler, CancellationToken ct)
{
Task.Run(async () =>
{
var stream = client.GetStream();
if (!stream.CanRead)
return;
var sb = new StringBuilder();
var buffer = new byte[4096];
int receivedCount;
while ((receivedCount = await stream.ReadAsync(buffer, 0, buffer.Length)) != 0)
{
var received = Encoding.ASCII.GetString(buffer, 0, receivedCount);
sb.Append(received);
}
var request = sb.ToString();
if (request.Length != 0 && tcpHandler(sb.ToString(), out var response))
{
var send = Encoding.ASCII.GetBytes(response);
stream.Write(send, 0, send.Length);
stream.Flush();
}
client.Close();
});
}
是的,该代码非常幼稚,没有真正的错误处理等。但是,这只是查看发送内容的一种方式。问题是对stream.ReadAsync
的调用会阻塞并且永远不会返回。我还检查了TcpClient.Available属性,它返回零(0)。最终,SmtpClient超时,似乎什么也没有发送。我还没有深入研究SMTP协议,所以也许我遗漏了一些东西?在通过SmtpClient发送数据之前,我是否需要以某种方式确认连接?
多年来我一直没有做太多的网络编码,而且我从来都不是这个领域的忍者。任何指针或提示将不胜感激。
干杯!