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
= []開啟到 信箱
的 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= 服務 |
信箱存取服務,預設為 "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 上會產生錯誤) |
使用者
使用者名稱
密碼
與 使用者
相關聯的密碼
旗標
旗標
是一個位元遮罩,包含下列一個或多個位元
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>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);
?>
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 參數為您的應用程式產生密碼
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";
}
?>
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 (或重新開啟) 中選取的信箱與其他 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 信箱中!
?>
不要費心在 $mailbox 或 $options 中使用 "/debug" 旗標或 OP_DEBUG。它們沒有任何作用。
當您設定其中一個時,底層的 IMAP c-client 程式庫會收集協定偵錯資料並傳回給 PHP。
但是,PHP 定義的偵錯處理常式是一個空函式,它不會執行任何操作。
因此,除非您使用自訂版本的 IMAP 擴充功能來處理該處理常式 (mm_dlog),否則使用 "/debug" 或 OP_DEBUG 沒有任何意義。
如果您收到 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'));
?>
當發生以下情況時,會出現錯誤: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 將不會開啟串流。如果存在 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"
:)
對於所有指定信箱字串的 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, '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
)
*/
?>
此致