由于意外的数据包格式登录到Pop3,握手失败

时间:2016-03-08 18:22:46

标签: c# ssl pop3

我正在尝试更新监控Exchange Server邮箱的代码,以便它可以使用SSL登录。但是,当它尝试登录时,我收到错误:ServicePointManager.ServerCertificateValidationCallback += (o, c, ch, er) => true; try { tcpClient = new TcpClient(Host, Port); } catch (SocketException e) { ... } try { var stream = client.GetStream(); ssl = new SslStream(stream); ssl.AuthenticateAsClient(Host, null, SslProtocols.Tls, true); streamReader = new StreamReader(ssl); response = streamReader.ReadLine(); if (response.StartsWith("+OK")) { response = SendReceive("USER ", UserName.Trim() + "@" + Domain.Trim()); if (response.StartsWith("+OK")) { response = SendReceive("PASS ", Password); } } if (response.StartsWith("+OK")) result = true; } catch (Exception e) { ... }

我的连接代码如下(删除了日志记录和注释):

    --- Exception ---
Error:  3/8/2016 10:32:35 AM    The handshake failed due to an unexpected packet format.
Info:   3/8/2016 10:32:35 AM    There was an error connecting to the account.
The server returned 
The handshake failed due to an unexpected packet format.
Info:   3/8/2016 10:32:35 AM    Source: System
Info:   3/8/2016 10:32:35 AM    Method: Void StartReadFrame(Byte[], Int32, System.Net.AsyncProtocolRequest)
Info:   3/8/2016 10:32:35 AM    
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
   at System.Net.Security.SslStream.AuthenticateAsClient(String targetHost, X509CertificateCollection clientCertificates, SslProtocols enabledSslProtocols, Boolean checkCertificateRevocation)
   at POP3_Communication.Pop3.GetStreamReader(TcpClient client)
   at POP3_Communication.Pop3.Connect()

从日志记录开始,我在第二次尝试之后的前四行中找到了异常(实际上是在GetStreamReader方法中,但为了简洁和可读性,我将它组合在一起)。

我收到的例外情况如下:

public void methodDog()
{
    methodDogInternal();
}

internal virtual void methodDogInternal()
{
}

1 个答案:

答案 0 :(得分:4)

我可以根据您的异常堆栈跟踪进一步缩小范围:)

  

at System.Net.Security.SslStream.AuthenticateAsClient(String targetHost,X509CertificateCollection clientCertificates,SslProtocols enabledSslProtocols,Boolean checkCertificateRevocation)

问题是您正在连接到未启用SSL的端口(即您可能连接到端口110而不是995)。

您是否考虑过使用MailKit这样的库而不是自己推出解决方案?