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

// 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();
}
' 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

// 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();
' 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.