如何在PHP中通过SSH连接到imap

时间:2019-01-04 11:03:57

标签: php ssh imap

我正在尝试通过PHP中的ssh与imap进行通信。 以下代码演示了如何通过ssh连接到imap:

$ssh_conn = ssh2_connect($sshIP, $sshPORT);
ssh2_auth_password($ssh_conn, $sshUSERNAME, $sshPASSWORD);
$stream = ssh2_tunnel($c, $imapSERVER, $imapPORT);

似乎一切正常,我通过ssh连接到imap。没有错误,我在$ stream中有资源。

然后我尝试将LOGIN命令写入流,像这样:

fwrite($stream, "A1 LOGIN username password\r\n");

问题是服务器没有任何响应。

我试图得到这样的答复:

while (true) {
     echo fread($stream, 4096);
}

不用担心用于向imap服务器写入和读取数据的代码,这只是我举例编写的。这在这里并不重要。问题是我没有从imap得到任何回应。始终为空字符串。

我敢肯定,由于我使用大的HORDE库https://dev.horde.org/imap_client/,并且在使用SOCKS5或HTTPS流时,编写和读取方法也能正常工作!

我还尝试了其他SSH服务器-失败了。

那么,哪里可能有问题? 另外,以下信息可能会有用: 将stream_get_meta_data()用于ssh和socks5流时,我得到了不同的信息。

SSH:

array(8) {
  ["exit_status"]=>
  int(0)
  ["timed_out"]=>
  bool(false)
  ["blocked"]=>
  bool(true)
  ["eof"]=>
  bool(false)
  ["stream_type"]=>
  string(12) "SSH2 Channel"
  ["mode"]=>
  string(2) "r+"
  ["unread_bytes"]=>
  int(0)
  ["seekable"]=>
  bool(false)
}

SOCKS5:

array(8) {
  ["crypto"]=>
  array(4) {
    ["protocol"]=>
    string(7) "TLSv1.2"
    ["cipher_name"]=>
    string(27) "ECDHE-RSA-AES128-GCM-SHA256"
    ["cipher_bits"]=>
    int(128)
    ["cipher_version"]=>
    string(7) "TLSv1.2"
  }
  ["timed_out"]=>
  bool(false)
  ["blocked"]=>
  bool(true)
  ["eof"]=>
  bool(false)
  ["stream_type"]=>
  string(14) "tcp_socket/ssl"
  ["mode"]=>
  string(2) "r+"
  ["unread_bytes"]=>
  int(0)
  ["seekable"]=>
  bool(false)
}

我还通知了重要的事情,如果我将端口143用于imap服务器,则它可以正常工作。如果我使用端口993,则不起作用。但是143不是ssl。因此,我什至不能使用LOGIN命令。我认为原因与SSL有关。但是,如何为ssh隧道设置ssl?

0 个答案:

没有答案