PHP Conference Japan 2024

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

開啟到 信箱IMAP 流。

此函式也可用來開啟到 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=服務 信箱存取服務,預設為 "imap"
/user=使用者 用於登入伺服器的遠端使用者名稱
/authuser=使用者 遠端驗證使用者;如果指定,這是其密碼用於的使用者名稱(例如,管理員)
/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 上會產生錯誤)

使用者

使用者名稱

密碼

使用者 相關聯的密碼

旗標

旗標 是一個位元遮罩,包含下列一個或多個位元

重試

最大連線嘗試次數

選項

連線參數,可以使用下列(字串)索引鍵來設定一個或多個連線參數

  • 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>INBOX 中的標頭</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 筆筆記

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"。
這真令人難過。
neekToO
2 年前
回覆 "dsgvoseidank" 的說法,即它不再適用於 Gmail

截至 2022 年 8 月 26 日的今天,它仍然有效,但您需要在雙重驗證帳戶上使用 Google 參數為您的應用程式產生密碼
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";

######
# web.de 沒有 ssl 的 pop3
# $authhost="{pop3.web.de:110/pop3/notls}";
# $user="kay.marquardt@web.de";

#########
# 具有 pop3 或 imap 的 goggle
# $authhost="{pop.gmail.com:995/pop3/ssl/novalidate-cert}";
# $authhost="{imap.gmail.com:993/imap/ssl/novalidate-cert}";
# $user="username@gmail.com";

$user="如上所述的使用者名稱";
$pass="您的密碼";

if (
$mbox=imap_open( $authhost, $user, $pass ))
{
echo
"<h1>已連線</h1>\n";
imap_close($mbox);
} else
{
echo
"<h1>失敗!</h1>\n";
}

?>
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/
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
hashampel at yahoo dot de
10 年前
INBOX 的子資料夾必須以點分隔,例如:'INBOX.test'
$mailbox = '{example.example.com:143/imap/novalidate-cert}INBOX.test'
dominic_mayers at yahoo dot com
7 年前
此程式碼示範了目前未詳細記載的功能。主要功能是 imap_open (或重新開啟) 中選取的信箱與其他 imap 函式中指定的信箱無關。它已使用 Gmail 和 Dovecot IMAP 伺服器進行測試。信箱分隔符號取決於伺服器。Gmail:"/" Dovecot:"."。如果您想使用 Gmail 進行測試,您需要在您的帳戶中啟用「允許安全性較低的應用程式存取」。

<?php
// 修改這些設定。
$server = "{imap.gmail.com:993/imap/ssl/novalidate-cert}";
$email = "example@gmail.com";
$password = "password";

// 此程式碼假設 Test/Sub1/Sub11 等資料夾存在。
$selected = "{$server}Test/Sub1/Sub12";
$conn = imap_open($selected, $email , $password);

// 這會回傳 $specified 信箱及其子信箱,
// 即使 $specified 信箱在 $selected 信箱之外。
$specified = "{$server}Test/Sub1";
$boxes = imap_list($conn, $specified , '*');
print_r($boxes);

// 這會將訊息附加到 $specified 信箱。
// 它會忽略 $selected 信箱。
imap_append($conn, $specified
, "From: me@example.com\r\n"
. "To: you@example.com\r\n"
. "Subject: test\r\n"
. "\r\n"
. "this is a test message, please ignore\r\n");

// 這會變更 $selected 信箱
$selected = "{$server}Test/Sub1";
imap_reopen($conn, $selected);

// 這會將訊息從 $selected 移動到 $specified 信箱
// 在此情況下,$specified 信箱不包含伺服器。
imap_mail_move ($conn , "1" , "Test");
imap_expunge($conn);
imap_close($conn);
// 如果您使用真實的 IMAP 伺服器執行此程式碼,
// 訊息現在位於 Test 信箱中!
?>
me at achronos dot ca
10 年前
不要費心在 $mailbox 或 $options 中使用 "/debug" 旗標或 OP_DEBUG。它們沒有任何作用。

當您設定其中一個時,底層的 IMAP c-client 程式庫會收集協定偵錯資料並傳回給 PHP。
但是,PHP 定義的偵錯處理常式是一個空函式,它不會執行任何操作。

因此,除非您使用自訂版本的 IMAP 擴充功能來處理該處理常式 (mm_dlog),否則使用 "/debug" 或 OP_DEBUG 沒有任何意義。
LANGE.LUDO
6 年前
如果您收到 Kerberos 錯誤,例如
« Notice: 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'));
?>
Lisboa
9 年前
當發生以下情況時,會出現錯誤:Unknown: Mailbox is empty (errflg=1) in Unknown on line 0


1) 使用 imap_open 連線
2) 然後使用 imap_search ALL 擷取電子郵件

但沒有可用的訊息。為了避免這個錯誤,請先使用 imap_status 檢查信箱中的訊息數量。只有當有可用的訊息時,您才能使用 imap_search。
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');
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() 似乎還不夠。
shaikh_zaid at yahoo dot com
18 年前
如果您的伺服器使用傳輸層安全性 (即 TLS),imap_open 將不會開啟串流。如果存在 SSL,imap_open 會與其連線。因此,請嘗試如下開啟信箱:

$mailbox="{mail.domain.com:143/imap/notls}";

$mailbox="{mail.domain.com:110/pop3/notls}"; 這有效...

某些郵件伺服器要求您提供 username@domain.com,因此您可以隨時使用 user@doamin.com

$conn=imap_open($mailbox, $username, $password);

某些伺服器可能會要求使用者名稱為 "user=user@domain.com"

:)
frederik at roal dot no
22 年前
對於所有指定信箱字串的 imap 函式,請務必**總是**使用 IP (而不是主機名稱) 和連接埠號碼。如果您不這樣做,imap 函式將會非常慢。
使用主機名稱而不是 IP 會使每個 IMAP 呼叫增加 3 秒,而不使用連接埠號碼會使每個 imap 呼叫增加 10 秒。(提示:使用 gethostbyname())
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",可以查看您的所有任務。我希望這對任何人都有幫助!

此致
brojann at netscape dot com
23 年前
您可以執行

<? $foo = imap_errors(); ?>

來清除不必要的警告訊息,例如「信箱是空的」。
m dot stoel at cyberkinetic dot nl
19 年前
給那些即使閱讀了所有正確的解決方案並實施它們,但仍然遇到相同錯誤或根本沒有錯誤而感到沮喪的人的小提示。
在變更程式碼之後.. 重新啟動 httpd 精靈。

對於 Fedora 或任何其他 Red Hat Linux 作業系統 (/etc/init.d/httpd restart)。

在此之後,您將能夠從 apache 建立 imap/pop3 串流。
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, 'user@gmail.com', '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