C# 如果指定了错误的端口,SmtpClient将挂起且不会引发异常

C# 如果指定了错误的端口,SmtpClient将挂起且不会引发异常,c#,asp.net,smtpclient,C#,Asp.net,Smtpclient,我试图在Asp.NETC#应用程序中使用端口465和主机“smtp.gmail.com”发送电子邮件,但整个应用程序挂起(继续加载)。在调试时,它被卡在SmtpClient.Send(msg)上 不管指定的凭据如何,它都不会抛出任何异常以捕获或任何超时错误。我必须关闭或刷新页面才能重新访问该页面 如果我改为使用587端口,则一切正常,SmtpClient.Send会响应并发送电子邮件,或返回适当的异常,例如操作超时或基于凭据发送电子邮件失败 为了演示,我简化了下面的代码: var smtp =

我试图在Asp.NETC#应用程序中使用端口465和主机“smtp.gmail.com”发送电子邮件,但整个应用程序挂起(继续加载)。在调试时,它被卡在SmtpClient.Send(msg)上

不管指定的凭据如何,它都不会抛出任何异常以捕获或任何超时错误。我必须关闭或刷新页面才能重新访问该页面

如果我改为使用587端口,则一切正常,SmtpClient.Send会响应并发送电子邮件,或返回适当的异常,例如操作超时或基于凭据发送电子邮件失败

为了演示,我简化了下面的代码:

var smtp = new SmtpClient
                        {
                            Host = "smtp.gmail.com",
                            Port = 465,
                            EnableSsl = true,
                            Timeout = 200, // or any value it doesn't solve the problem
                            DeliveryMethod = SmtpDeliveryMethod.Network,
                            UseDefaultCredentials = false,
                            Credentials = new NetworkCredential("name@gmail.com", "password")
                        };

var msg = new MailMessage("name@gmail.com", "name@gmail.com", "Any subject", "Any body"); 
smtp.Send(msg); // stuck here
smtp.Dispose(); // never reached
msg.Dispose();
我尝试了SendAsync并缩短了超时时间间隔,但这并没有解决问题。我认为问题在于smtp.gmail.com已经到达,但没有正确响应端口465,这就是为什么该方法被卡住的原因

我需要避免这种行为,因为我的应用程序允许动态设置smtp服务器详细信息,并且我不希望在输入错误详细信息的情况下整个应用程序挂起

谢谢,


找到了这个答案,以防有人来这里


使用语句将SmptClient包装在
中,以确保调用Dispose


我不确定这是否是原因或您的问题,但我也遇到了同样的问题(第一次正确发送,之后经常失败),这为我解决了问题。

奇怪的是,我从来没有遇到过问题,而且它看起来是正确的。听起来有点像这个问题,但我不认为他真的有解决办法。你能使用任何其他应用程序在你的网络上发送出站吗?
使用(var smtp=…)
使用(var msg=…)
@devshorts我只使用Wireshark捕获TCP流量,这够了吗?@AustinSalonen我试着按照你的建议使用(smtp){using(msg){smtp.send(msg);}包装它,但它不起作用,问题与处理对象无关,而是停留在发送命令上。我知道。这就是为什么它是一个注释而不是一个答案。如果它成功了,我们该怎么做,即如何通过此套接字发送消息?
Dispose
将永远不会在
send
挂起时调用。
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IAsyncResult result = socket.BeginConnect("192.168.1.180", 25, null, null);
// Two second timeout
bool success = result.AsyncWaitHandle.WaitOne(2000, true);
if (!success) {
    socket.Close();
    throw new ApplicationException("Failed to connect server.");
}