如果指定了错误的端口,则SmtpClient挂起,不会抛出任何异常

时间:2013-03-20 21:38:20

标签: c# asp.net smtpclient

我尝试使用端口465和主机“smtp.gmail.com”在我的Asp.Net C#应用程序中发送电子邮件,但整个应用程序挂起(继续加载)。调试时,它停留在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服务器的详细信息,我不希望整个应用程序在输入错误的详细信息时挂起。

谢谢,

enter image description here

2 个答案:

答案 0 :(得分:3)

如果有人来到这里,我们会找到这个答案

SmtpClient Timeout doesn't work

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.");
}

答案 1 :(得分:-1)

将您的SmptClient包装在using语句中,以确保调用Dispose。

我不确定这是不是原因或问题,但是我遇到了同样的问题(第1次正确发送,之后经常失败),这已经为我纠正了。