2024年PHP开发者大会日本站

imap_open

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_open打开到邮箱的IMAP

描述

imap_open(
    字符串 $mailbox,
    字符串 $user,
    字符串 $password,
    整数 $flags = 0,
    整数 $retries = 0,
    数组 $options = []
): IMAP\Connection|false

打开到mailboxIMAP流。

此函数也可用于打开到POP3NNTP服务器的流,但某些函数和功能仅在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是具有以下一个或多个位的位掩码

重试次数

最大连接尝试次数

选项

连接参数,可以使用以下(字符串)键设置一个或多个连接参数

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

另请参见

添加注释

用户贡献的注释 18 条注释

29
php at dsgvoseidank dot de
2 年前
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”
这太令人沮丧了。
7
neekToO
2 年前
回复“dsgvoseidank”,说明它现在无法再与 Gmail 一起使用了

截至 2022 年 8 月 26 日,它仍然可以使用,但是您需要使用 Google 参数为您的应用生成 2FA 帐户的密码。
13
kay at rrr dot de
14 年前
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";
}

?>
12
jeff at newscloud dot com
10 年前
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/
13
guilherme dot geronimo at gmail dot com
14 年前
使用
<?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
6
hashampel at yahoo dot de
10 年前
INBOX 的子文件夹必须用点分开,例如:'INBOX.test'
$mailbox = '{example.example.com:143/imap/novalidate-cert}INBOX.test'
4
dominic_mayers at yahoo dot com
7 年前
此代码演示了目前文档记录不完善的功能。主要功能是 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邮箱中!
?>
4
me at achronos dot ca
10 年前
不要使用 $mailbox 中的 "/debug" 标志或 $options 中的 OP_DEBUG。它们没有任何作用。

设置其中任何一个时,底层的 IMAP c-client 库将收集协议调试数据并将其传递回 PHP。
但是,PHP 定义的调试处理程序是一个空函数,它什么也不做。

因此,除非你使用的是执行了该处理程序操作的自定义版本的 IMAP 扩展(mm_dlog),否则使用 "/debug" 或 OP_DEBUG 没有任何意义。
1
LANGE.LUDO
6年前
如果你遇到 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'));
?>
1
Lisboa
9年前
错误:Unknown: Mailbox is empty (errflg=1) in Unknown on line 0
出现在

1) 使用 imap_open 连接
2) 然后使用 imap_search ALL 检索电子邮件

但没有可用的邮件。要避免此错误,请首先使用 imap_status 检查邮箱中的邮件数量。只有在有可用邮件的情况下,才能使用 imap_search。
2
Anonymous
6年前
用于测试连接的大多数可能选项的函数

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');
2
liamr at umich dot edu
20年前
要使用 kerberos V/GSSAPI 进行身份验证,你可能需要向连接字符串添加 "user="。例如

$mbox = imap_open( "\{imap.example.com:143/imap/notls/user=" . $user . "}INBOX", $user, $passwd );

除非你在连接字符串中指定额外的 "user=",否则我们的 IMAP 服务器不允许使用 Kerberos 凭据中指定的用户名以外的用户使用这些凭据进行连接。将其作为参数传递给 imap_open() 似乎不够。
2
shaikh_zaid at yahoo dot com
18年前
如果你的服务器使用传输层安全协议 (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]"

:)
3
frederik at roal dot no
22年前
对于所有你指定邮箱字符串的 imap 函数,务必始终使用 IP(而不是主机名)和端口号。如果不这样做,imap 函数将非常慢。
使用主机名代替 IP 会为每个 IMAP 调用增加 3 秒,不使用端口号会为每个 imap 调用增加 10 秒。(提示:使用 gethostbyname())
2
rvarkelen AT hortimax.nl
20年前
为了与 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",可以查看所有任务。希望这对大家有所帮助!

此致
2
brojann at netscape dot com
23年前
你可以执行

<? $foo = imap_errors(); ?>

以清除不需要的警告消息,例如“邮箱为空”。
1
m dot stoel at cyberkinetic dot nl
19年前
对于那些即使阅读了所有正确的解决方案并实现了它们,但仍然遇到相同的错误或根本没有错误而感到非常沮丧的人,这里有一个小技巧:
更改代码后……重新启动 httpd 守护进程……

对于 Fedora 或任何其他 Red Hat Linux 操作系统(/etc/init.d/httpd restart)。

之后,你将能够从 Apache 创建 imap/pop3 流……
0
Stefano
2 年前
“多年来我学到的一件事是,”
如果有人说:“这是不可能的”,那就证明他们是错的。~ 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
)
*/
?>
此致
To Top