Received an unexpected EOF or 0 bytes from the transport stream

When you are getting the following error:
Received an unexpected EOF or 0 bytes from the transport stream.
while using ConnectSSL method, most likely your server incorrectly advertises TLS support. You might be required to use SSLv2 or SSLv3.

This article describes how to force SSLv3 or SSLv2 in Mail.dll or in regular .NET SslStream class.

Force SSLv3 or SSLv2 in Mail.dll

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
// C# version
using (Imap client = new Imap())
{
   // Force to use SSL3
   client.SSLConfiguration.EnabledSslProtocols = SslProtocols.Ssl3;
   // Ignore certificate errors
   client.ServerCertificateValidate += (sender, e) => { e.IsValid = true; };
   client.ConnectSSL("imap.gmail.com");
   client.Login("user@gmail.com", "password");
 
   client.SelectInbox();
   foreach(long uid in client.Search(Flag.Unseen))
   {
       var eml = client.GetMessageByUID(uid);
       IMail email = new MailBuilder().CreateFromEml(eml);
       Console.WriteLine(email.Subject);
   }
   client.Close();
}
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
' VB.NET version
 
Using client As New Imap()
    ' Force to use SSL3
    client.SSLConfiguration.EnabledSslProtocols = SslProtocols.Ssl3
    ' Ignore certificate errors
    AddHandler client.ServerCertificateValidate, AddressOf Validate
    client.ConnectSSL("imap.gmail.com")
    client.Login("user@gmail.com", "password")
 
    client.SelectInbox()
    For Each uid As Long In client.Search(Flag.Unseen)
        Dim eml = client.GetMessageByUID(uid)
        Dim email As IMail = New MailBuilder().CreateFromEml(eml)
        Console.WriteLine(email.Subject)
    Next
    client.Close()
End Using
 
Private Sub ValidateCerificate( _
    ByVal sender As Object, _
    ByVal e As ServerCertificateValidateEventArgs)
 
    Const ignoredErrors As SslPolicyErrors = _
        SslPolicyErrors.RemoteCertificateChainErrors Or _
        SslPolicyErrors.RemoteCertificateNameMismatch
 
    If (e.SslPolicyErrors And Not ignoredErrors) = SslPolicyErrors.None Then
        e.IsValid = True
        Return
    End If
    e.IsValid = False
End Sub

Force SSLv3 or SSLv2 in SslStream class

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
// C# version
const string host = "imap.gmail.com";
 
Socket socket = new Socket(
   AddressFamily.InterNetwork,
   SocketType.Stream,
   ProtocolType.Tcp);
socket.Connect(host, 993);
using(SslStream ssl = new SslStream(new NetworkStream(socket), true))
{
   ssl.AuthenticateAsClient(
      host,
      new X509CertificateCollection(),
      SslProtocols.Ssl3,
      true);
   using(StreamReader reader = new StreamReader(ssl))
   {
       Console.WriteLine(reader.ReadLine());
   }
}
socket.Close();
01
02
03
04
05
06
07
08
09
10
11
12
13
' VB.NET version
 
Const host As String = "imap.gmail.com"
 
Dim socket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
socket.Connect(host, 993)
Using ssl As New SslStream(New NetworkStream(socket), True)
    ssl.AuthenticateAsClient(host, New X509CertificateCollection(), SslProtocols.Ssl3, True)
    Using reader As New StreamReader(ssl)
        Console.WriteLine(reader.ReadLine())
    End Using
End Using
socket.Close()

Tags:

Questions?

Consider using our Q&A forum for asking questions.