我正在尝试使用在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中没有正确设置。
有什么想法吗?
答案 0 :(得分:11)
在PHP中需要启用的另一项功能是OpenSSL extension。似乎IMAP客户端库(使用SSL)依赖于此。
Apache是否启用了OpenSSL模块并不重要,因为在将请求传递给PHP之前对其进行了处理/处理。
以下讨论主题可能有助于解释一下:
答案 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)
首先,在您的Gmail帐户中启用安全性较低的应用:https://myaccount.google.com/lesssecureapps
使用此配置创建IMAP连接:
$imap_connection = imap_open('{imap.gmail.com:993/imap/ssl/novalidate-
cert}INBOX', 'YOUR GMAIL USER', 'YOUR GMAIL PASSWORD');
注意:INBOX是您的主要imbox,例如,您可以通过以下连接访问已发送的项目:INBOX.Sent。
答案 9 :(得分:0)
我是Arvind Gondaliya,您是对的,但如果关闭安全性较低的地区,则会收到Gmail邮件。