Php 无法连接:Can';t打开邮箱{imap.gmail.com:993/imap/ssl/novalidate cert}收件箱:远程规范无效

Php 无法连接:Can';t打开邮箱{imap.gmail.com:993/imap/ssl/novalidate cert}收件箱:远程规范无效,php,ssl,gmail,imap,gmail-imap,Php,Ssl,Gmail,Imap,Gmail Imap,多年来一直在寻找解决这个错误的方法 试图从gmail帐户保存电子邮件附件,但不断收到错误: Cannot connect to Gmail: Can't open mailbox {imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX: invalid remote specification 从PHP错误日志: [05-Dec-2014 14:41:06 Europe/Berlin] PHP Warning: imap_open(): Coul

多年来一直在寻找解决这个错误的方法

试图从gmail帐户保存电子邮件附件,但不断收到错误:

Cannot connect to Gmail: Can't open mailbox {imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX: invalid remote specification
从PHP错误日志:

[05-Dec-2014 14:41:06 Europe/Berlin] PHP Warning:  imap_open(): Couldn't open stream {imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX in /Applications/MAMP/htdocs/get_docs_from_email.php on line 23
[05-Dec-2014 14:41:06 Europe/Berlin] PHP Notice:  Unknown: Can't open mailbox {imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX: invalid remote specification (errflg=2) in Unknown on line 0
有什么帮助吗

我正在使用的完整代码:

/* connect to gmail with your credentials */
$hostname = '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX';
$username = 'MYEMAIL@gmail.com'; # e.g somebody@gmail.com
$password = 'MYPASSWORD';


/* try to connect */
$inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Gmail: ' . imap_last_error());

/* get all new emails. If set to 'ALL' instead 
 * of 'NEW' retrieves all the emails, but can be 
 * resource intensive, so the following variable, 
 * $max_emails, puts the limit on the number of emails downloaded.
 * 
 */
$emails = imap_search($inbox,'ALL');

/* useful only if the above search is set to 'ALL' */
$max_emails = 16;

/* if any emails found, iterate through each email */
if($emails) {

    $count = 1;

    /* put the newest emails on top */
    rsort($emails);

    /* for every email... */
    foreach($emails as $email_number) 
    {

        /* get information specific to this email */
        $overview = imap_fetch_overview($inbox,$email_number,0);

        /* get mail message */
        $message = imap_fetchbody($inbox,$email_number,2);

        /* get mail structure */
        $structure = imap_fetchstructure($inbox, $email_number);

        $attachments = array();

        /* if any attachments found... */
        if(isset($structure->parts) && count($structure->parts)) 
        {
            for($i = 0; $i < count($structure->parts); $i++) 
            {
                $attachments[$i] = array(
                    'is_attachment' => false,
                    'filename' => '',
                    'name' => '',
                    'attachment' => ''
                );

                if($structure->parts[$i]->ifdparameters) 
                {
                    foreach($structure->parts[$i]->dparameters as $object) 
                    {
                        if(strtolower($object->attribute) == 'filename') 
                        {
                            $attachments[$i]['is_attachment'] = true;
                            $attachments[$i]['filename'] = $object->value;
                        }
                    }
                }

                if($structure->parts[$i]->ifparameters) 
                {
                    foreach($structure->parts[$i]->parameters as $object) 
                    {
                        if(strtolower($object->attribute) == 'name') 
                        {
                            $attachments[$i]['is_attachment'] = true;
                            $attachments[$i]['name'] = $object->value;
                        }
                    }
                }

                if($attachments[$i]['is_attachment']) 
                {
                    $attachments[$i]['attachment'] = imap_fetchbody($inbox, $email_number, $i+1);

                    /* 4 = QUOTED-PRINTABLE encoding */
                    if($structure->parts[$i]->encoding == 3) 
                    { 
                        $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
                    }
                    /* 3 = BASE64 encoding */
                    elseif($structure->parts[$i]->encoding == 4) 
                    { 
                        $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
                    }
                }
            }
        }

        /* iterate through each attachment and save it */
        foreach($attachments as $attachment)
        {
            if($attachment['is_attachment'] == 1)
            {
                $filename = $attachment['name'];
                if(empty($filename)) $filename = $attachment['filename'];

                if(empty($filename)) $filename = time() . ".dat";

                /* prefix the email number to the filename in case two emails
                 * have the attachment with the same file name.
                 */
                $fp = fopen("saved_email_docs/" . $email_number . "-" . $filename, "w+");
                fwrite($fp, $attachment['attachment']);
                fclose($fp);
            }

        }

        if($count++ >= $max_emails) break;
    }

} 

/* close the connection */
imap_close($inbox);

echo "Done";
/*使用您的凭据连接到gmail*/
$hostname='{imap.gmail.com:993/imap/ssl/novalidate cert}收件箱';
$username='1MYEMAIL@gmail.com'; # 例如somebody@gmail.com
$password='MYPASSWORD';
/*尝试连接*/
$inbox=imap_open($hostname,$username,$password)或die('cannotconnecttogmail:'。imap_last_error());
/*收到所有新邮件。如果改为设置为“全部”
*“NEW”检索所有电子邮件,但可以是
*资源密集型,因此以下变量,
*$max_电子邮件,限制下载的电子邮件数量。
* 
*/
$emails=imap_搜索($inbox,'ALL');
/*仅当上述搜索设置为“全部”时才有用*/
$max_=16;
/*如果发现任何电子邮件,请反复阅读每封电子邮件*/
如果($电子邮件){
$count=1;
/*把最新的电子邮件放在最上面*/
rsort(电子邮件);
/*对于每封电子邮件*/
foreach($email作为$email\u编号)
{
/*获取此电子邮件的特定信息*/
$overview=imap\U fetch\U overview($inbox,$email\u number,0);
/*获取邮件消息*/
$message=imap\u fetchbody($inbox,$email\u number,2);
/*获取邮件结构*/
$structure=imap\u fetchstructure($inbox,$email\u number);
$attachments=array();
/*如果找到任何附件*/
if(设置($structure->parts)和计数($structure->parts))
{
对于($i=0;$iparts);$i++)
{
$attachments[$i]=数组(
'is_attachment'=>false,
'文件名'=>'',
'名称'=>'',
“附件”=>“
);
if($structure->parts[$i]->ifdparameters)
{
foreach($structure->parts[$i]->dparameters as$object)
{
如果(strtolower($object->attribute)='filename')
{
$attachments[$i]['is_attachment']=true;
$attachments[$i]['filename']=$object->value;
}
}
}
如果($structure->parts[$i]->ifparameters)
{
foreach($structure->parts[$i]->参数作为$object)
{
如果(strtolower($object->attribute)='name')
{
$attachments[$i]['is_attachment']=true;
$attachments[$i]['name']=$object->value;
}
}
}
如果($attachments[$i]['is_attachment']))
{
$attachments[$i]['attachment']=imap_fetchbody($inbox,$email_number,$i+1);
/*4=引用的可打印编码*/
如果($structure->parts[$i]->encoding==3)
{ 
$attachments[$i]['attachment']=base64_decode($attachments[$i]['attachment']);
}
/*3=BASE64编码*/
elseif($structure->parts[$i]->encoding==4)
{ 
$attachments[$i]['attachment']=引用的可打印解码($attachments[$i]['attachment']);
}
}
}
}
/*遍历每个附件并保存它*/
foreach($attachments作为$attachment)
{
如果($attachment['is_attachment']==1)
{
$filename=$attachment['name'];
如果(空($filename))$filename=$attachment['filename'];
如果(空($filename))$filename=time().“.dat”;
/*在两封电子邮件中,在文件名前面加上电子邮件号码
*具有相同文件名的附件。
*/
$fp=fopen(“保存的电子邮件文件/”$email\u编号。”-“$filename,”w+”;
fwrite($fp,$attachment['attachment']);
fclose($fp);
}
}
如果($count++>=$max_电子邮件)中断;
}
} 
/*关闭连接*/
imap_关闭($收件箱);
回应“完成”;
编辑:

我已经签入了我的php.ini,可以看到imap.so已启用。我已经读到phpinfo应该显示——使用imap ssl,但它现在并不希望改变这一点

另外,我正在使用MAMP和PHP5.6.2作为参考


同时使用telnet检查连接,我可以很好地连接。

为什么要使用/novalidate证书?谷歌没有有效的证书吗

还可以尝试使用/debug标志获取更多详细信息


一个关于外部的问题。。。您当然已经使用普通邮件客户端bevor连接到此帐户,并且它确实存在,对吗?我在过去遇到过谷歌的问题,在那里登录是很困难的blabla@gmail.com邮件是blabla@googlemail.com ... 特别是如果帐户有点旧。

我已经尝试了主机名的所有方法,我读到novalidate cert为一些人工作过等等。是的,只是将它连接到我的iPhone。我认为问题在于PHP,显然默认情况下MAMP没有启用IMAP SSL。我刚刚意识到您正在使用MAMP!!哦,好吧。。。查看他们的论坛。。。10%的帖子对未包含imap ssl表示遗憾。由于我没有运行MAMP,我无法确认这一点,但如果您在谷歌上搜索,则有一些关于如何使用imap ssl编译MAMP的详细信息。很抱歉没有更好的消息。