尝试连接到没有任何邮件服务器的主机名时出现奇怪的超时行为



我开发了一个自定义类,它使用MailKit和MimeKit与IMAP4邮件服务器进行交互。它就像一个魅力,但我最近注意到一些让我感到有点不舒服的事情:

看起来,如果您具体化一个存在但没有邮件服务器的主机,它会尝试连接大约 30 秒,最终抛出异常,此处引用。感觉就像它试图搜索邮件服务器,但由于没有人回复,它有点"迷路"。

我将Timeout属性设置为5000ms但看起来它仅在连接后应用。

问题是...有没有办法通过.NET本身在高级"层"中控制它,或者这应该被视为MailKit错误?

呼叫连接:

imap.ServerCertificateValidationCallback = (s, c, h, e) => true;
imap.Connect(hostname, puerto, SecureSocketOptions.SslOnConnect);
imap.Authenticate(username, password);

异常堆栈跟踪:

en System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
en System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
en System.Net.Sockets.Socket.Connect(IPAddress address, Int32 port)
en MailKit.Net.Imap.ImapClient.Connect(String host, Int32 port, SecureSocketOptions options, CancellationToken cancellationToken)
en Utilities.Imap4.Imap.Connect(String hostname, String username, String password, ConnectionType secure, Int32 port) en xxxxImap4Imap4Imap4.cs:línea 121

超时属性不会影响 Connect 方法,事实证明,套接字上的超时属性具有相同的限制。有一个关于如何在超时后中止 Socket.Connect(( 的 StackOverflow 答案,但它有点丑陋。你可以实现这个答案,然后调用ImapClient.Connect((并传递给它Socket。

相关内容

最新更新