Connect and BeginConnect methods take quite a long time to timeout, when you use incorrect server address. It usually takes almost 20 seconds for those methods to decide that connection is impossible. Setting SendTimeout/ReceiveTimeout doesn’t influence this in any way.
Not only Imap, Pop3, and Smtp classes suffer from this problem, it’s the same for regular Socket class.
There is a solution however, using BeginConnect and simply waiting for specified amount of time (AsyncWaitHandle.WaitOne) without calling EndConnect (which blocks):
// C#
using(Imap imap =new Imap())
{
IAsyncResult result = imap.BeginConnectSSL("imap.example.com");
// 5 seconds timeout
bool success = result.AsyncWaitHandle.WaitOne(5000, true);
if (success == false)
{
throw new Exception("Failed to connect server.");
}
imap.EndConnect(result);
//...
imap.Close();
}
' VB.NET
Using imap As New Imap()
Dim result As IAsyncResult = imap.BeginConnectSSL("imap.example.com")
' 5 seconds timeout
Dim success As Boolean = result.AsyncWaitHandle.WaitOne(5000, True)
If success = False Then
Throw New Exception("Failed to connect server.")
End If
imap.EndConnect(result)
'...
imap.Close()
End Using