我想从以下位置获取电子邮件outlook.office365.com
使用 IMAP 和 PHP。
由于大多数电子邮件包含非 ASCII 字符,例如äöü
, I use UTF-8
in my imap_search()
功能:
imap_search($mbox_connection, 'ALL', SE_UID, "UTF-8")
With 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
to US-ASCII
:
imap_search($mbox_connection, 'UNSEEN', SE_UID, "US-ASCII")
现在,它会返回所有预期的未见过(未读)电子邮件。
现在的问题是,我无法搜索带有 UTF-8 字符的电子邮件。例如,我有一封包含以下信息的电子邮件:
- 来自: 纽伦堡阿普费尔
- 主题:阿普菲尔 vs. 阿普菲尔
- Body:
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?= <[email protected] /cdn-cgi/l/email-protection>>
Subject: =?iso-8859-1?Q?Apfel_vs._=C4pfel?=
但是当我改为搜索带有 UTF-8 字符的单词时(在本例中äpfel
),它找不到电子邮件:
imap_search($mbox_connection, 'FROM "äpfel"', SE_UID, "US-ASCII")
由于这个事实,我已经改回了字符集US-ASCII
to UTF-8
,但这只会在错误消息处再次结束[BADCHARSET (US-ASCII)]
.
我的代码很简单:
$mailbox = "{outlook.office365.com:993/imap/ssl}INBOX";
$mailbox_username = "[email protected] /cdn-cgi/l/email-protection";
$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";
}
我已经尝试过这个解决方案,但这也返回没有匹配的电子邮件:
$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');
任何想法,我如何在电子邮件字段中搜索非 ASCII 字符From
, Subject
and Body
当 IMAP 服务器不支持时UTF-8
我也不能在服务器端配置上更改它?
这似乎是所有 Microsoft Exchange 服务器的问题。据我通过谷歌发现,只有那些服务器有这个问题。