代码之家  ›  专栏  ›  技术社区  ›  Clint Miller

使用php通过imap连接到gmail-ssl上下文失败

  •  20
  • Clint Miller  · 技术社区  · 16 年前

    我正试图用运行在Apache中的PHP通过IMAP连接到Gmail。这是一个Ubuntu9.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
    

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

    有什么想法吗?

    8 回复  |  直到 16 年前
        1
  •  11
  •   Jordan S. Jones    16 年前

    您还需要在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

        2
  •  9
  •   Ben    14 年前

    经过长期的努力,这对我很有效:

    $ServerName = "{imap.gmail.com:993/imap/ssl/novalidate-cert/norsh}Inbox";
    
        3
  •  8
  •   Adnan Ahmad    9 年前

    我也面临同样的问题。 我正在使用Windows和WAMP,并且我的WAMP“openssl”扩展已启用。

    我通过以下步骤消除了这个问题。我希望这对您也适用。

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

    2)打开此URL“ https://www.google.com/settings/security/lesssecureapps

    3)点击“打开”

    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);
    
    
    ?>
    

    祝你好运。:)

        4
  •  3
  •   Anton Danilov    9 年前

    谷歌应用程序上的个人域名也有同样的问题。通过将应用程序访问权更改为帐户,解决了这个问题。简单地跟随 by link 打开帐户访问。

        5
  •  1
  •   Derick Schoonbee    16 年前

    php -f gmail.php
    

    在我的Ubuntu上我做到了:

    sudo apt-get install php5-imap
    

    安装系统:libc-client2007b mlock libc-client2007b mlock php5 imap

    然后卸载php5并重新安装干净。

        6
  •  0
  •   ayman    16 年前

    检查设置 phpinfo() 确保你看到 --with-imap-ssl 上市的。

        7
  •  0
  •   abdul01    10 年前

    如果你在Gmail上仍然有这个问题,请确保在你的谷歌账户安全设置页面中启用“允许访问不太安全的应用”。

        8
  •  0
  •   Esteban    8 年前
    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');
      

    注释 :inbox是您的主要IMbox,例如,您可以使用:inbox.访问已发送的邮件。通过您的连接发送。