2017-07-29 8 views
1

IMAP4メールサーバとやりとりするためにMailKitとMimeKitを使ったカスタムクラスを開発しました。それは魅力的なように働いていましたが、私は少し不快に感じるようなものについて最近気づいた:メールサーバを持っていないホスト名に接続しようとすると奇妙なタイムアウトが発生する

メールサーバが存在していてもメールサーバを持っていないホストを具体的に見れば、約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 xxxx\Imap4\Imap4\Imap4.cs:línea 121 

答えて

1

Timeoutプロパティは、Connectメソッドには影響しません、それはソケット上のタイムアウトプロパティは同じ制限を持っていることが判明しました。タイムアウトの後にSocket.Connect()を中止する方法については、StackOverflowの回答がありますが、それは少し醜いです。その答えを実装し、ImapClient.Connect()を呼び出してSocketを渡すことができます。

+0

返信いただきありがとうございます、Jeffrey!私はそれを試してみましょう! – Gonzo345

関連する問題