PHP imap_search:Microsoft Exchange 邮件服务器上的 UTF-8 / 非 ASCII 字符
PHP imap_search: UTF-8 / Non-ASCII characters on Microsoft Exchange mail servers
我想使用 IMAP 和 PHP 从 outlook.office365.com
获取电子邮件。
由于大多数电子邮件包含非 ASCII 字符,例如 äöü
,我在 imap_search()
函数中使用 UTF-8
:
imap_search($mbox_connection, 'ALL', SE_UID, "UTF-8")
使用 UTF-8
和搜索条件 ALL
我按预期收到了所有电子邮件。现在,我想将其限制为例如仅看不见(未读)的电子邮件:
imap_search($mbox_connection, 'UNSEEN', SE_UID, "UTF-8")
但不幸的是,这导致了问题,即无法再找到电子邮件 - 尽管有看不见的电子邮件 - 并且它还会抛出此 PHP 通知:
PHP Notice: Unknown: [BADCHARSET (US-ASCII)] The specified charset is not supported. (errflg=2) in Unknown on line 0
根据此通知,我已将字符集从 UTF-8
更改为 US-ASCII
:
imap_search($mbox_connection, 'UNSEEN', SE_UID, "US-ASCII")
现在,它 returns 所有预期的看不见(未读)的电子邮件。
现在的问题是,我无法搜索包含 UTF-8 字符的电子邮件。例如,我有一封包含这些信息的电子邮件:
- 发件人:Äpfel Nürnberg
- 主题:Apfel 与 Äpfel
- 正文:
Einzahl gegen Mehrzahl.
Ein Apfel, mehrere Äpfel.
当我尝试搜索主题为 "apfel" 的所有电子邮件时,它按预期工作 - 我可以找到电子邮件:
imap_search($mbox_connection, 'FROM "apfel"', SE_UID, "US-ASCII")
Trying to connect to '{outlook.office365.com:993/imap/ssl}INBOX'...
Found 1 email(s)...
+------ P A R S I N G ------+
From: =?iso-8859-1?Q?=C4pfel=20N=FCrnberg?= <=?iso-8859-1?Q?=C4pfel=20N=FCrnberg?= <aepfel@nuernberg.de>>
Subject: =?iso-8859-1?Q?Apfel_vs._=C4pfel?=
但是当我使用 UTF-8 字符搜索单词时(在本例中为 äpfel
),它没有找到电子邮件:
imap_search($mbox_connection, 'FROM "äpfel"', SE_UID, "US-ASCII")
因此,我已将字符集从 US-ASCII
改回 UTF-8
,但这只会在错误消息 [BADCHARSET (US-ASCII)]
.
处再次结束
我的代码很简单:
$mailbox = "{outlook.office365.com:993/imap/ssl}INBOX";
$mailbox_username = "someone@outlook.com";
$mailbox_password = "*******";
echo "Trying to connect to '$mailbox'...\n";
$mbox_connection = imap_open($mailbox, $mailbox_username, $mailbox_password);
$mailsIds = imap_search($mbox_connection, 'SUBJECT "äpfel"', SE_UID, "UTF-8");
if(!$mailsIds) {
echo "No emails found!\n";
imap_close($mbox_connection);
die();
}
echo "Found " . count($mailsIds) . " email(s)...\n";
foreach($mailsIds as $mailId) {
echo "+------ P A R S I N G ------+\n";
$headersRaw = imap_fetchheader($mbox_connection, $mailId, FT_UID);
$header = imap_rfc822_parse_headers($headersRaw);
echo "From: " . $header->from[0]->personal . " <" . $header->fromaddress . ">\n";
echo "Subject: " . $header->subject . "\n";
}
我已经尝试过这个解决方案,但是这个 returns 也没有匹配的电子邮件:
$str = "äpfel";
$str = preg_replace('/\=\?ISO\-8859\-1\?Q\?/i', '', mb_encode_mimeheader($str, "ISO-8859-1", "Q"));
$mailsIds = imap_search($mbox_connection, 'SUBJECT "'.$str.'"', SE_UID, 'US-ASCII');
任何想法,当 IMAP 服务器不支持 UTF-8
时,如何在电子邮件字段 From
、Subject
和 Body
中搜索非 ASCII 字符而且我也不能在服务器端配置上更改它?
这似乎是所有 Microsoft Exchange 服务器的问题。据我通过 Google.
发现,只有那些服务器有这个问题
你可能做不到。
Exchange 似乎没有实现对 IMAP 的字符集感知搜索,这样做不是 RFC3501 的要求(仅 US-ASCII 必须支持)。通常支持 UTF-8,但 Exchange 似乎并非如此。
您将不得不切换协议(EAS、EWS、REST 服务等)或提取信息,自行解码并搜索。如果你缓存它,从长远来看这甚至不是太糟糕。由于它是 headers,您可以一次获取所有内容。如果需要搜身,那就更难了。
我想使用 IMAP 和 PHP 从 outlook.office365.com
获取电子邮件。
由于大多数电子邮件包含非 ASCII 字符,例如 äöü
,我在 imap_search()
函数中使用 UTF-8
:
imap_search($mbox_connection, 'ALL', SE_UID, "UTF-8")
使用 UTF-8
和搜索条件 ALL
我按预期收到了所有电子邮件。现在,我想将其限制为例如仅看不见(未读)的电子邮件:
imap_search($mbox_connection, 'UNSEEN', SE_UID, "UTF-8")
但不幸的是,这导致了问题,即无法再找到电子邮件 - 尽管有看不见的电子邮件 - 并且它还会抛出此 PHP 通知:
PHP Notice: Unknown: [BADCHARSET (US-ASCII)] The specified charset is not supported. (errflg=2) in Unknown on line 0
根据此通知,我已将字符集从 UTF-8
更改为 US-ASCII
:
imap_search($mbox_connection, 'UNSEEN', SE_UID, "US-ASCII")
现在,它 returns 所有预期的看不见(未读)的电子邮件。
现在的问题是,我无法搜索包含 UTF-8 字符的电子邮件。例如,我有一封包含这些信息的电子邮件:
- 发件人:Äpfel Nürnberg
- 主题:Apfel 与 Äpfel
- 正文:
Einzahl gegen Mehrzahl.
Ein Apfel, mehrere Äpfel.
当我尝试搜索主题为 "apfel" 的所有电子邮件时,它按预期工作 - 我可以找到电子邮件:
imap_search($mbox_connection, 'FROM "apfel"', SE_UID, "US-ASCII")
Trying to connect to '{outlook.office365.com:993/imap/ssl}INBOX'...
Found 1 email(s)...
+------ P A R S I N G ------+
From: =?iso-8859-1?Q?=C4pfel=20N=FCrnberg?= <=?iso-8859-1?Q?=C4pfel=20N=FCrnberg?= <aepfel@nuernberg.de>>
Subject: =?iso-8859-1?Q?Apfel_vs._=C4pfel?=
但是当我使用 UTF-8 字符搜索单词时(在本例中为 äpfel
),它没有找到电子邮件:
imap_search($mbox_connection, 'FROM "äpfel"', SE_UID, "US-ASCII")
因此,我已将字符集从 US-ASCII
改回 UTF-8
,但这只会在错误消息 [BADCHARSET (US-ASCII)]
.
我的代码很简单:
$mailbox = "{outlook.office365.com:993/imap/ssl}INBOX";
$mailbox_username = "someone@outlook.com";
$mailbox_password = "*******";
echo "Trying to connect to '$mailbox'...\n";
$mbox_connection = imap_open($mailbox, $mailbox_username, $mailbox_password);
$mailsIds = imap_search($mbox_connection, 'SUBJECT "äpfel"', SE_UID, "UTF-8");
if(!$mailsIds) {
echo "No emails found!\n";
imap_close($mbox_connection);
die();
}
echo "Found " . count($mailsIds) . " email(s)...\n";
foreach($mailsIds as $mailId) {
echo "+------ P A R S I N G ------+\n";
$headersRaw = imap_fetchheader($mbox_connection, $mailId, FT_UID);
$header = imap_rfc822_parse_headers($headersRaw);
echo "From: " . $header->from[0]->personal . " <" . $header->fromaddress . ">\n";
echo "Subject: " . $header->subject . "\n";
}
我已经尝试过这个解决方案,但是这个 returns 也没有匹配的电子邮件:
$str = "äpfel";
$str = preg_replace('/\=\?ISO\-8859\-1\?Q\?/i', '', mb_encode_mimeheader($str, "ISO-8859-1", "Q"));
$mailsIds = imap_search($mbox_connection, 'SUBJECT "'.$str.'"', SE_UID, 'US-ASCII');
任何想法,当 IMAP 服务器不支持 UTF-8
时,如何在电子邮件字段 From
、Subject
和 Body
中搜索非 ASCII 字符而且我也不能在服务器端配置上更改它?
这似乎是所有 Microsoft Exchange 服务器的问题。据我通过 Google.
发现,只有那些服务器有这个问题你可能做不到。
Exchange 似乎没有实现对 IMAP 的字符集感知搜索,这样做不是 RFC3501 的要求(仅 US-ASCII 必须支持)。通常支持 UTF-8,但 Exchange 似乎并非如此。
您将不得不切换协议(EAS、EWS、REST 服务等)或提取信息,自行解码并搜索。如果你缓存它,从长远来看这甚至不是太糟糕。由于它是 headers,您可以一次获取所有内容。如果需要搜身,那就更难了。