9

我试图在我的 Asp.Net C# 应用程序中使用端口 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 服务器详细信息,并且我不希望整个应用程序在输入错误详细信息的情况下挂起。

谢谢,

在此处输入图像描述

4

2 回答 2

3

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

SmtpClient 超时不起作用

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.");
}
于 2014-06-07T02:56:31.070 回答
-1

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

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

于 2014-11-20T04:16:02.190 回答