2

在我现在正在进行的项目中,我正在尝试添加功能,当用户向支持台发送电子邮件时,我可以将工单的状态从“关闭”更改为“重新打开”。我还想将他们的电子邮件回复保存到数据库中。

我遇到的问题是我无法让 PHP 的 IMAP 函数在我当前的 Apache 配置上工作。从stackoverflow和其他地方的很多帖子来看,问题似乎是标准配置中没有启用OpenSSL。因此,例如,当我运行此代码时:

<h1>IMAP testing!</h1>
<?php
$connect = "{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX";
$user    = "my email address @gmail.com";
$pass    = "my password";

$mailbox = imap_open($connect, $user, $pass);
?>

我得到错误:

Can't open mailbox {imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX: invalid remote specification.

除了重新编译 PHP 之外,我还能做些什么来模仿本地机器上的 IMAP 功能,以便能够继续开发使用电子邮件(电子邮件管道)的功能?

关于我当前配置的一些注释,以防万一它有帮助:

  • OS X 10.7.4
  • PHP v.5.3.1

更新 -

我快到了(感谢 dAm2K)!

我安装了 Stunnel(使用 Mac 端口),最后配置了所有内容并运行了命令:

sudo stunnel /opt/local/etc/stunnel/stunnel.conf -c -d 127.0.0.1:443 -r imap.gmail.com:993

(无论出于何种原因,我都必须添加 .conf 文件的路径)

现在我的代码如下所示:

<?php
$connect = "{localhost:443}INBOX";
$user    = "my email address @gmail.com";
$pass    = "my password";

$mailbox = imap_open($connect, $user, $pass);
?>

现在,当我加载页面时,它只会挂起 30 秒左右并发出警告:

Notice: Unknown: Connection failed to localhost,443: Operation timed out (errflg=2) in Unknown on line 0

有趣的是,如果我将 $connect 更改为:

$connect = "{localhost:443/ssl}INBOX";

或者

$connect = "{localhost:443/novalidate-cert}INBOX";

我得到了原来的错误,它是:

Notice: Unknown: Can't open mailbox {localhost:443/novalidate-cert}INBOX: invalid remote specification (errflg=2) in Unknown on line 0

有任何想法吗?只是一个猜测,但它可能与 stunnel 的设置有关,比如拥有自签名证书或我缺少的 stunnel.conf 文件?

非常感谢。

蒂姆

4

1 回答 1

1

您可能有一个防火墙阻止传出 TCP 数据包到 imap.gmail.com 的端口 993。

请您的系统管理员检查 dport 993 (imap) 上的传出 TCP。还要检查您的 DNS 是否正在解析 imap.gmail.com:

命令:

telnet imap.gmail.com 993

应该给你一个有效的连接。如果不成功,您就发现了问题。

你可能想在你的开发机器上安装一个 IMAP 服务器,以便继续离线开发......你可以安装“courier imap”包,但这不是一个非常简单的任务......

如果连接成功并且命令:

openssl s_client -connect imap.gmail.com:993

给你一个有效的连接,问题可能是你的 libc-client 没有编译 SSL 支持。在这种情况下,你不能将 imaps 与 PHP 一起使用,你可以使用“stunnel”命令转发来自你的清晰流量本地机器加密到 gmail IMAP 服务器。

命令:

stunnel -c -d 127.0.0.1:443 -r imap.gmail.com:993

应该做的伎俩。这样您就可以将您的 PHP 脚本连接到 127.0.0.1:443:

<?
  $connect = "{localhost:443}INBOX";
?>
于 2012-05-14T12:39:51.090 回答