【问题标题】:Cannot get TcpClient to connect to gmail无法让 TcpClient 连接到 gmail
【发布时间】:2012-11-12 17:38:44
【问题描述】:

我正在尝试制作可以阅读电子邮件的东西,但我无法正常工作。这段代码:

TcpClient c = new TcpClient();
c.Connect("imap.gmail.com", 993);
NetworkStream stream = c.GetStream();
stream.ReadTimeout = 1000;
stream.ReadByte();

接缝是我下载的任何代码中断的地方。最后一行抛出一个 IOException 消息:“无法从传输连接中读取数据:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接的主机没有响应。 "

我会满足于第三方程序,它会以我可以阅读的格式自动下载电子邮件。我已经让 Thunderbird 连接到 gmail,所以问题肯定在我这边。

【问题讨论】:

  • 你不需要先给它写点东西才能读到它吗?
  • @minitech 也许吧?我尝试只向流中写入一个零字节,但它仍然中断。
  • @nos 如果我将超时更改为 60 秒,它仍然会中断。
  • @user1820576:不,我的意思是我认为您需要发送一个有效的请求,Gmail 会响应。 (不过只是一个猜测——我不知道 IMAP 的具体细节......)

标签: c# tcp gmail imap ioexception


【解决方案1】:

您正在 SSL 端口上进行连接。如果您没有进行正确的 SSL 握手,它将在不久之后关闭连接,而不会向您发送任何数据。

【讨论】:

  • 该消息将指示断开连接。而且,他什么也没送。
【解决方案2】:

消息表明远程服务器没有响应。它没有说“此端口上不允许连接”。它没有说“我关闭连接”。它什么也没说。

这意味着您甚至无法在 TCP 级别上创建连接。试试这个:

telnet imap.gmail.com 993

它会失败。所以与你的申请无关。

【讨论】:

    【解决方案3】:

    使用 openssl 连接到 gmail。这是完成工作的简单方法。

    【讨论】:

      【解决方案4】:

      Gmail IMAP 使用 SSL,因此您需要使用 SslStream 包装您的网络流并调用 AuthenticateAsClient 方法(以便它执行 SSL 握手/服务器身份验证魔术)。之后,您可以像正常(非 SSL)流一样与之交互:

      TcpClient c = new TcpClient();
      c.Connect("imap.gmail.com", 993);
      SslStream sslStream = new SslStream(c.GetStream());
      sslStream.ReadTimeout = 1000;
      sslStream.AuthenticateAsClient("imap.gmail.com");
      sslStream.ReadByte();
      

      【讨论】:

        猜你喜欢
        • 2015-08-16
        • 1970-01-01
        • 2014-01-16
        • 2012-10-11
        • 2017-08-17
        • 1970-01-01
        • 2018-02-07
        • 2013-09-11
        • 2020-04-25
        相关资源
        最近更新 更多