使用IMAP通过IMAP连接到Gmail - SSL上下文失败

时间:2009-08-13 22:14:49

标签: php ssl ubuntu gmail imap

我正在尝试使用在Apache中运行的PHP通过IMAP连接到Gmail。这是在Ubuntu 9.04系统上。我有一些PHP配置问题,这使得它无法正常工作。首先,这是我为PHP设置IMAP所做的工作:

sudo apt-get install libc-client2007b libc-client2007b-dev
sudo apt-get install php5-imap
sudo /etc/init.d/apache2 start

当我运行phpinfo()时,我得到以下imap值:

IMAP c-Client Version: 2004
SSL Support: enabled
Kerberos Support: enabled

这是我的示例代码:

<?php
$connect_to = '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX';
$user = 'my gmail address';
$password = 'my gmail password';

$connection = imap_open($connect_to, $user, $password)
  or die("Can't connect to '$connect_to': " . imap_last_error());

imap_close($connection);
?>

当我执行此代码时,我得到以下输出:

Warning: imap_open() [function.imap-open]: Couldn't open stream {imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX in /var/www/clint/gmail/gmail.php on line 10
Can't connect to '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX': TLS/SSL failure for imap.gmail.com: SSL context failed

请注意,我可以从此计算机telnet到imap.gmail.com:993。我还可以通过IMAP将Evolution(邮件阅读器)连接到Gmail并毫无问题地获取邮件。所以,我认为这不是防火墙问题。我很确定我在PHP中没有正确设置。

有什么想法吗?

10 个答案:

答案 0 :(得分:11)

在PHP中需要启用的另一项功能是OpenSSL extension。似乎IMAP客户端库(使用SSL)依赖于此。

Apache是​​否启用了OpenSSL模块并不重要,因为在将请求传递给PHP之前对其进行了处理/处理。

以下讨论主题可能有助于解释一下:

http://groups.google.com/group/comp.lang.php/browse_thread/thread/241e619bc70a8bf4/bd3ae0c6a82409bc?lnk=raot&pli=1

答案 1 :(得分:9)

经过长时间的努力,这对我有用:

$ServerName = "{imap.gmail.com:993/imap/ssl/novalidate-cert/norsh}Inbox";

答案 2 :(得分:8)

我遇到了同样的问题。 我正在使用Windows和wamp以及我的wamp&#34; openSSl&#34;扩展已启用。

我通过使用以下步骤删除了此问题。我希望这也适合您。

1)通过浏览器登录到gmail帐户。

2)打开此网址&#34; https://www.google.com/settings/security/lesssecureapps&#34;

3)点击&#34;打开&#34;

4)尝试以下代码

<?php

set_time_limit(4000);


// Connect to gmail
//$imapPath = '{imap.gmail.com:993/imap/ssl}INBOX';
$imapPath = '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX';
$username = 'your-emai-address@gmail.com';
$password = 'Your-password';

// try to connect
$inbox = imap_open($imapPath,$username,$password) or die('Cannot connect to Gmail: ' . imap_last_error());
   /* ALL - return all messages matching the rest of the criteria
    ANSWERED - match messages with the \\ANSWERED flag set
    BCC "string" - match messages with "string" in the Bcc: field
    BEFORE "date" - match messages with Date: before "date"
    BODY "string" - match messages with "string" in the body of the message
    CC "string" - match messages with "string" in the Cc: field
    DELETED - match deleted messages
    FLAGGED - match messages with the \\FLAGGED (sometimes referred to as Important or Urgent) flag set
    FROM "string" - match messages with "string" in the From: field
    KEYWORD "string" - match messages with "string" as a keyword
    NEW - match new messages
    OLD - match old messages
    ON "date" - match messages with Date: matching "date"
    RECENT - match messages with the \\RECENT flag set
    SEEN - match messages that have been read (the \\SEEN flag is set)
    SINCE "date" - match messages with Date: after "date"
    SUBJECT "string" - match messages with "string" in the Subject:
    TEXT "string" - match messages with text "string"
    TO "string" - match messages with "string" in the To:
    UNANSWERED - match messages that have not been answered
    UNDELETED - match messages that are not deleted
    UNFLAGGED - match messages that are not flagged
    UNKEYWORD "string" - match messages that do not have the keyword "string"
    UNSEEN - match messages which have not been read yet*/

// search and get unseen emails, function will return email ids
$emails = imap_search($inbox,'UNSEEN');

$output = '';

foreach($emails as $mail) {

    $headerInfo = imap_headerinfo($inbox,$mail);

    $output .= $headerInfo->subject.'<br/>';
    $output .= $headerInfo->toaddress.'<br/>';
    $output .= $headerInfo->date.'<br/>';
    $output .= $headerInfo->fromaddress.'<br/>';
    $output .= $headerInfo->reply_toaddress.'<br/>';

    $emailStructure = imap_fetchstructure($inbox,$mail);
    //var_dump($emailStructure->parts);
    if(isset($emailStructure->parts)) {
         $output .= imap_body($inbox, $mail, FT_PEEK);
    } else {
        //    
    }
   echo $output;
   $output = '';
}

// colse the connection
imap_expunge($inbox);
imap_close($inbox);


?>
最好的运气。 :)

答案 3 :(得分:3)

在Google应用上与个人域名存在同样的问题。通过更改应用程序对帐户的访问权限来解决问只需点击by link即可开启帐户访问权限。

答案 4 :(得分:1)

从命令行运行您的代码,看看php是否吐出任何其他错误:

php -f gmail.php

在我的Ubuntu上我做了:

sudo apt-get install php-imap

在php上安装imap 并安装了系统:libc-client2007b mlock libc-client2007b mlock php-imap

然后如何卸载php5并彻底重新安装。

答案 5 :(得分:1)

特定于Gmail的IMAP服务器:

Google已开始为不提供SNI主机名的TLSv13连接返回无效证书。 当针对升级的OpenSSL(libssl)版本构建php-imap扩展时,这将导致回归。 问题已在此处报告:

后面的版本是最近的,我已将其提交给Ubuntu维护者以使其对他们可见,并希望吸引更多的目光,因为它会影响LTS版本的Ubuntu Bionic。

请对其进行投票和/或评论,以提高知名度。 还要记住:如果您对这个答案有用并且也足够支持,则上述问题将更加明显。

同时,在我看来,直到修复该错误之后,唯一的解决方法是在调用imap_open()时使用/novalidate-cert标志来禁用证书验证,这存在安全隐患。

答案 6 :(得分:0)

使用phpinfo()检查您的设置,并确保列出--with-imap-ssl

答案 7 :(得分:0)

如果您在gmail上仍然遇到此问题,请务必在Google帐户安全设置页面中启用“允许访问安全性较低的应用”。

答案 8 :(得分:0)

  1. 首先,在您的Gmail帐户中启用安全性较低的应用:https://myaccount.google.com/lesssecureapps enter image description here

  2. 使用此配置创建IMAP连接:

    $imap_connection = imap_open('{imap.gmail.com:993/imap/ssl/novalidate-
    cert}INBOX', 'YOUR GMAIL USER', 'YOUR GMAIL PASSWORD');
    
  3. 注意:INBOX是您的主要imbox,例如,您可以通过以下连接访问已发送的项目:INBOX.Sent。

答案 9 :(得分:0)

我是Arvind Gondaliya,您是对的,但如果关闭安全性较低的地区,则会收到Gmail邮件。