Google 已于 2022 年 5 月 30 日停止支持用户名/密码身份验证。
如果没有 xoauth2 的支持,imap_open 将无法再使用。
https://support.google.com/accounts/answer/6010255
2020 年有一个待办事项没有完成。
https://wiki.php.net/todo/ext/imap/xoauth2
唯一的方法是切换到第三方库。“php-imap”
这太令人沮丧了。
(PHP 4, PHP 5, PHP 7, PHP 8)
imap_open — 打开到邮箱的IMAP流
$mailbox
,$user
,$password
,$flags
= 0,$retries
= 0,$options
= []打开到mailbox
的IMAP流。
此函数也可用于打开到POP3和NNTP服务器的流,但某些函数和功能仅在IMAP服务器上可用。
邮箱
邮箱名称由服务器和此服务器上的邮箱路径组成。特殊名称INBOX
代表当前用户的个人邮箱。除了可打印的ASCII空间中的字符外,包含国际字符的邮箱名称必须使用imap_utf7_encode()进行编码。
除非禁用了imap.enable_insecure_rsh,否则将不受信任的数据传递给此参数是不安全的。
服务器部分(用'{'和'}'括起来)包含服务器名称或IP地址、可选端口(以':'为前缀)和可选协议规范(以'/'为前缀)。
服务器部分在所有邮箱参数中都是必需的。
所有以{
开头的名称都是远程名称,格式为"{" remote_system_name [":" port] [flags] "}" [mailbox_name]
,其中
remote_system_name
- 服务器的互联网域名或带括号的IP地址。
port
- 可选的TCP端口号,默认为该服务的默认端口
flags
- 可选标志,请参见下表。
mailbox_name
- 远程邮箱名称,默认为INBOX
标志 | 描述 |
---|---|
/service= service |
邮箱访问服务,默认为“imap” |
/user= user |
服务器上登录的远程用户名 |
/authuser= user |
远程身份验证用户;如果指定,则为使用其密码的用户名称(例如管理员) |
/anonymous |
以匿名用户身份进行远程访问 |
/debug |
在应用程序的调试日志中记录协议遥测数据 |
/secure |
不要通过网络传输明文密码 |
/imap , /imap2 , /imap2bis , /imap4 , /imap4rev1 |
相当于/service=imap |
/pop3 |
相当于/service=pop3 |
/nntp |
相当于/service=nntp |
/norsh |
不要使用rsh或ssh建立预先认证的IMAP会话 |
/ssl |
使用安全套接字层 加密会话 |
/validate-cert |
验证来自TLS/SSL服务器的证书(这是默认行为) |
/novalidate-cert |
不要验证来自TLS/SSL服务器的证书,如果服务器使用自签名证书则需要此选项 |
/tls |
强制使用start-TLS 加密会话,并拒绝连接到不支持它的服务器 |
/notls |
即使服务器支持,也不要使用start-TLS 加密会话 |
/readonly |
请求只读邮箱打开(仅限IMAP;在NNTP上忽略,在SMTP和POP3上出错) |
用户
用户名
密码
与user
关联的密码
标志
flags
是具有以下一个或多个位的位掩码
OP_READONLY
- 以只读方式打开邮箱
OP_ANONYMOUS
- 不要使用或更新新闻的.newsrc(仅限NNTP)
OP_HALFOPEN
- 对于IMAP和NNTP名称,打开连接但不打开邮箱。
CL_EXPUNGE
- 在邮箱关闭时自动清除邮箱(另请参见imap_delete()和imap_expunge())
OP_DEBUG
- 调试协议协商
OP_SHORTCACHE
- 短(仅限elt
)缓存
OP_SILENT
- 不要传递事件(内部使用)
OP_PROTOTYPE
- 返回驱动程序原型
OP_SECURE
- 不要进行不安全的身份验证
重试次数
最大连接尝试次数
选项
连接参数,可以使用以下(字符串)键设置一个或多个连接参数
DISABLE_AUTHENTICATOR
- 禁用身份验证属性
成功时返回一个IMAP\Connection实例,失败时返回false
。
版本 | 描述 |
---|---|
8.1.0 | 现在返回一个IMAP\Connection实例;以前返回的是资源。 |
示例 #1 imap_open()的不同用法
<?php
// 要连接到本地机器上端口 143 上运行的 IMAP 服务器,
// 请执行以下操作:
$mbox = imap_open("{localhost:143}INBOX", "user_id", "password");
// 要连接到本地服务器上端口 110 上的 POP3 服务器,请使用:
$mbox = imap_open ("{localhost:110/pop3}INBOX", "user_id", "password");
// 要连接到 SSL IMAP 或 POP3 服务器,请在协议
// 说明符之后添加 /ssl:
$mbox = imap_open ("{localhost:993/imap/ssl}INBOX", "user_id", "password");
// 要连接到带有自签名证书的 SSL IMAP 或 POP3 服务器,
// 请在协议说明符之后添加 /ssl/novalidate-cert:
$mbox = imap_open ("{localhost:995/pop3/ssl/novalidate-cert}", "user_id", "password");
// 要连接到本地服务器上端口 119 上的 NNTP 服务器,请使用:
$nntp = imap_open ("{localhost:119/nntp}comp.test", "", "");
// 要连接到远程服务器,请将 "localhost" 替换为您要连接到的服务器的名称或
// IP 地址。
?>
示例 #2 imap_open() 示例
<?php
$mbox = imap_open("{imap.example.org:143}", "username", "password");
echo "<h1>邮箱</h1>\n";
$folders = imap_listmailbox($mbox, "{imap.example.org:143}", "*");
if ($folders == false) {
echo "调用失败<br />\n";
} else {
foreach ($folders as $val) {
echo $val . "<br />\n";
}
}
echo "<h1>收件箱中的邮件头</h1>\n";
$headers = imap_headers($mbox);
if ($headers == false) {
echo "调用失败<br />\n";
} else {
foreach ($headers as $val) {
echo $val . "<br />\n";
}
}
imap_close($mbox);
?>
Google 已于 2022 年 5 月 30 日停止支持用户名/密码身份验证。
如果没有 xoauth2 的支持,imap_open 将无法再使用。
https://support.google.com/accounts/answer/6010255
2020 年有一个待办事项没有完成。
https://wiki.php.net/todo/ext/imap/xoauth2
唯一的方法是切换到第三方库。“php-imap”
这太令人沮丧了。
回复“dsgvoseidank”,说明它现在无法再与 Gmail 一起使用了
截至 2022 年 8 月 26 日,它仍然可以使用,但是您需要使用 Google 参数为您的应用生成 2FA 帐户的密码。
imap_open 使用起来非常简单,但在使用 ssl 和 tls 的设置中会遇到一些困难。
这些是针对不同主机和协议的测试示例。
取消主机/协议行的注释,并填写正确的用户名和密码。
Kay
<?php
#######
# 带有和不带有 ssl 的本地主机 pop3
# $authhost="{localhost:995/pop3/ssl/novalidate-cert}";
# $authhost="{localhost:110/pop3/notls}";
# 带有和不带有 ssl 的本地主机 imap
# $authhost="{localhost:993/imap/ssl/novalidate-cert}";
# $authhost="{localhost:143/imap/notls}";
# $user="localuser";
# 带有和不带有 ssl 的本地主机 nntp
# 您必须指定一个现有的组,control.cancel 应该存在
# $authhost="{localhost:563/nntp/ssl/novalidate-cert}control.cancel";
# $authhost="{localhost:119/nntp/notls}control.cancel";
######
# 没有 ssl 的 web.de pop3
# $authhost="{pop3.web.de:110/pop3/notls}";
# $user="[email protected]";
#########
# 使用 pop3 或 imap 的谷歌
# $authhost="{pop.gmail.com:995/pop3/ssl/novalidate-cert}";
# $authhost="{imap.gmail.com:993/imap/ssl/novalidate-cert}";
# $user="[email protected]";
$user="如上所示的用户名";
$pass="您的密码";
if ($mbox=imap_open( $authhost, $user, $pass ))
{
echo "<h1>已连接</h1>\n";
imap_close($mbox);
} else
{
echo "<h1>失败!</h1>\n";
}
?>
Gmail IMAP SSL 身份验证的问题之一与 Google 的帐户安全有关。
一旦您收到登录错误,请注销所有 Google 帐户。然后,访问此链接
http://www.google.com/accounts/DisplayUnlockCaptcha
使用您尝试通过 imap 访问的帐户登录。
按照步骤操作,然后您就可以使用 php imap 登录 Gmail 了。
它在这里以可视方式显示
http://jeffreifman.com/filtered-open-source-imap-mail-filtering-software-for-php/configuring-gmail/
使用
<?php
imap_open( "{server.example.com:143}INBOX" , 'login' , 'password' );
?>
出现此错误
"无法打开流 {server.example.com:143}INBOX"
通过添加标志“novalidate-cert”解决
<?php
imap_open( "{server.example.com:143/novalidate-cert}INBOX" , 'login' , 'password' );
?>
=D
INBOX 的子文件夹必须用点分开,例如:'INBOX.test'
$mailbox = '{example.example.com:143/imap/novalidate-cert}INBOX.test'
此代码演示了目前文档记录不完善的功能。主要功能是 imap_open(或 reopen)中选择的邮箱与其他 imap 函数中指定的邮箱无关。它已在 Gmail 和 Dovecot IMAP 服务器上进行了测试。邮箱分隔符取决于服务器。Gmail:"/" Dovecot:"." 如果您想使用 Gmail 进行测试,则需要启用帐户中的“允许安全性较低的应用访问”。
<?php
// 修改这些。
$server = "{imap.gmail.com:993/imap/ssl/novalidate-cert}";
$email = "[email protected]";
$password = "password";
// 代码假设文件夹 Test/Sub1/Sub11 等已存在。
$selected = "{$server}Test/Sub1/Sub12";
$conn = imap_open($selected, $email , $password);
// 这将返回指定的邮箱及其子邮箱,
// 即使指定的邮箱在选定的邮箱之外。
$specified = "{$server}Test/Sub1";
$boxes = imap_list($conn, $specified , '*');
print_r($boxes);
// 这将邮件附加到指定的邮箱。
// 它忽略选定的邮箱。
imap_append($conn, $specified
, "From: [email protected]\r\n"
. "To: [email protected]\r\n"
. "Subject: test\r\n"
. "\r\n"
. "this is a test message, please ignore\r\n");
// 这将更改选定的邮箱
$selected = "{$server}Test/Sub1";
imap_reopen($conn, $selected);
// 这将邮件从选定的邮箱移动到指定的邮箱
// 在这种情况下,指定的邮箱不包含服务器。
imap_mail_move ($conn , "1" , "Test");
imap_expunge($conn);
imap_close($conn);
// 如果你使用真实的IMAP服务器执行此代码,
// 邮件现在在Test邮箱中!
?>
不要使用 $mailbox 中的 "/debug" 标志或 $options 中的 OP_DEBUG。它们没有任何作用。
设置其中任何一个时,底层的 IMAP c-client 库将收集协议调试数据并将其传递回 PHP。
但是,PHP 定义的调试处理程序是一个空函数,它什么也不做。
因此,除非你使用的是执行了该处理程序操作的自定义版本的 IMAP 扩展(mm_dlog),否则使用 "/debug" 或 OP_DEBUG 没有任何意义。
如果你遇到 Kerberos 错误,例如
« 注意:Unknown: Kerberos error: Credentials cache file '/tmp/krb5cc_0123' not found (try running kinit) »。
尝试添加为 $param
<?php array('DISABLE_AUTHENTICATOR' => 'GSSAPI') ?>
例如:
<?php
$imap_stream = imap_open('{mail.domain.tld:993/imap/ssl}' , 'username' , 'password', null, 1, array('DISABLE_AUTHENTICATOR' => 'GSSAPI'));
?>
错误:Unknown: Mailbox is empty (errflg=1) in Unknown on line 0
出现在
1) 使用 imap_open 连接
2) 然后使用 imap_search ALL 检索电子邮件
但没有可用的邮件。要避免此错误,请首先使用 imap_status 检查邮箱中的邮件数量。只有在有可用邮件的情况下,才能使用 imap_search。
用于测试连接的大多数可能选项的函数
function imapConfig($options, $i=0, $till = array()) {
if(sizeof($options)==$i)
return $till;
if(sizeof($till)==0)
$till[] = '';
$opt = $options[$i];
$new = array();
foreach($till as $t) {
foreach($opt as $o) {
if(strlen($o)==0)
$new[] = $t;
else
$new[] = $t.'/'.$o;
}
}
return imapConfig($options, $i+1, $new);
}
function imap_test($server, $port, $dir, $username, $passw) {
$options = array();
//$options[] = array('debug');
$options[] = array('imap', 'imap2', 'imap2bis', 'imap4', 'imap4rev1', 'pop3'); //nntp
$options[] = array('', 'norsh');
$options[] = array('', 'ssl');
$options[] = array('', 'validate-cert', 'novalidate-cert');
$options[] = array('', 'tls', 'notls');
$configOptions = imapConfig($options);
foreach($configOptions as $c) {
$mbox = @imap_open("{".$server.":".$port.$c."}".$dir, $username, $passw);
echo "<b>{".$server.":".$port.$c."}".$dir."</b> ... ";
if (false !== $mbox) {
echo '<span style="color: green"> success</span>';
}
else {
echo '<span style="color: red"> failed</span>';
}
echo '<br>';
}
}
imap_test('mail.server.de', 143, 'INBOX', 'username', 'pwd');
要使用 kerberos V/GSSAPI 进行身份验证,你可能需要向连接字符串添加 "user="。例如
$mbox = imap_open( "\{imap.example.com:143/imap/notls/user=" . $user . "}INBOX", $user, $passwd );
除非你在连接字符串中指定额外的 "user=",否则我们的 IMAP 服务器不允许使用 Kerberos 凭据中指定的用户名以外的用户使用这些凭据进行连接。将其作为参数传递给 imap_open() 似乎不够。
如果你的服务器使用传输层安全协议 (TLS),imap_open 将无法打开流。imap_open 在存在 SSL 的情况下使用 SSL 连接。因此,尝试如下打开邮箱:
$mailbox="{mail.domain.com:143/imap/notls}";
或者
$mailbox="{mail.domain.com:110/pop3/notls}"; 这有效……
一些邮件服务器要求你提供 [email protected],因此你可以始终使用 [email protected]
$conn=imap_open($mailbox, $username, $password);
某些服务器可能会要求用户名为 "[email protected]"
:)
对于所有你指定邮箱字符串的 imap 函数,务必始终使用 IP(而不是主机名)和端口号。如果不这样做,imap 函数将非常慢。
使用主机名代替 IP 会为每个 IMAP 调用增加 3 秒,不使用端口号会为每个 imap 调用增加 10 秒。(提示:使用 gethostbyname())
为了与 Microsoft Exchange Server 5.5 建立 IMAP 连接,我使用了此连接字符串:
<?php
if(imap_open ("{192.168.1.6:143/imap}Inbox", "DOMAIN/USERNAME/ALIAS", "PASSWORD"))
{
echo 'Connection success!';
}
else
{
echo 'Connection failed';
}
?>
通过将 "Inbox" 替换为例如 "Tasks",可以查看所有任务。希望这对大家有所帮助!
此致
对于那些即使阅读了所有正确的解决方案并实现了它们,但仍然遇到相同的错误或根本没有错误而感到非常沮丧的人,这里有一个小技巧:
更改代码后……重新启动 httpd 守护进程……
对于 Fedora 或任何其他 Red Hat Linux 操作系统(/etc/init.d/httpd restart)。
之后,你将能够从 Apache 创建 imap/pop3 流……
“多年来我学到的一件事是,”
如果有人说:“这是不可能的”,那就证明他们是错的。~ Stefano Kocka '99
测试日期:2022-11-20
php 版本:PHP 8.0.10 (cli)
extension=imap
extension=openssl
imap:IMAP c-Client 版本 => 2007f
SSL 支持 => 已启用
https://support.google.com/accounts/answer/185833?hl=en
<?php
$cnx = '{imap.gmail.com:993/imap/ssl/readonly}';
$mbox = imap_open($cnx, '[email protected]', 'MyAppPassword');
$folders = imap_listmailbox($mbox, $cnx, '*');
print_r($folders);
/*
Array
(
[0] => {imap.gmail.com:993/imap/ssl/readonly}INBOX
[1] => {imap.gmail.com:993/imap/ssl/readonly}LABEL1
[2] => {imap.gmail.com:993/imap/ssl/readonly}LABEL2
[3] => {imap.gmail.com:993/imap/ssl/readonly}Queue
[4] => {imap.gmail.com:993/imap/ssl/readonly}[Gmail]/All
[5] => {imap.gmail.com:993/imap/ssl/readonly}[Gmail]/Drafts
[6] => {imap.gmail.com:993/imap/ssl/readonly}[Gmail]/Sent
[7] => {imap.gmail.com:993/imap/ssl/readonly}[Gmail]/Spam
[8] => {imap.gmail.com:993/imap/ssl/readonly}[Gmail]/Starred
[9] => {imap.gmail.com:993/imap/ssl/readonly}[Gmail]/Trash
)
*/
?>
此致