PHP imap_search:搜索 UTF-8 / 支持 UTF-8 的非 ASCII 字符
PHP imap_search: Search UTF-8 / Non-ASCII characters with UTF-8 support
这是一个与这里的问题类似的问题:
但不同的是,本例中的邮件服务器支持 UTF-8 搜索,我们在 imap_search
函数中也使用 UTF-8。
我有一个这样的电子邮件主题:mountainguan测试
我想使用此 PHP 代码搜索包含此主题或部分主题的电子邮件:
$mailbox = "{any-mail.server.com:993/imap/ssl}INBOX";
$mailbox_username = "someone@server.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 "mountain"', 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: " . imap_utf8($header->fromaddress) . "\n";
echo "Subject: " . imap_utf8($header->subject) . "\n";
}
当我搜索 SUBJECT "mountain"
时,它会按预期返回电子邮件:
$ php imap-test.php
Trying to connect to '{any-mail.server.com:993/imap/ssl}'...
Found 1 email(s)...
+------ P A R S I N G ------+
From: Someone Else <someone@other-server.com>
Subject: mountainguan测试
当我现在将搜索更改为 SUBJECT "测试"
时,它返回的是:
$ php imap-test.php
Trying to connect to '{any-mail.server.com:993/imap/ssl}'...
No emails found!
相同的搜索通过 OpenSSL 进行,所以我希望它也可以与 PHP 一起使用:
openssl s_client -connect any-mail.server.com:993
a LOGIN someone@server.com *******
a OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SPECIAL-USE QUOTA] Logged in
a SELECT "inbox"
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft unknown-0 unknown-1 $NotJunk $Forwarded)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft unknown-0 unknown-1 $NotJunk $Forwarded \*)] Flags permitted.
* 9 EXISTS
* 0 RECENT
* OK [UNSEEN 9] First unseen.
* OK [UIDVALIDITY 1500057051] UIDs valid
* OK [UIDNEXT 5388] Predicted next UID
* OK [HIGHESTMODSEQ 14790] Highest
a OK [READ-WRITE] Select completed (0.000 + 0.000 secs).
a UID SEARCH SUBJECT "mountain"
* SEARCH 5387
a OK Search completed (0.001 + 0.000 secs).
a UID SEARCH SUBJECT "测试"
* SEARCH 5387
a OK Search completed (0.001 + 0.000 secs).
a UID FETCH 5387 (BODY[HEADER.FIELDS (subject date)])
* 9 FETCH (UID 5387 FLAGS (\Seen) BODY[HEADER.FIELDS (SUBJECT DATE)] {245}
Subject: =?UTF-8?Q?mountainguan=E6=B5=8B=E8=AF=95?=
Date: Sat, 4 May 2019 01:11:57 +0200
)
a OK Fetch completed (0.001 + 0.000 secs).
a logout
* BYE Logging out
a OK Logout completed (0.000 + 0.000 secs).
closed
这里使用PHP imap_search()
有什么问题?我是否需要将搜索字符串的某些内容转换/反编码或编码为其他内容?
您不必在 $mailsIds = imap_search($mbox_connection, 'SUBJECT "mountain"', SE_UID, "UTF-8");
处对 $criteria
字符串进行编码
请检查您的 php 脚本 (imap-test.php) 的编码。可能不是UTF-8。
你能把编码转换成UTF-8然后把$criteria
改成mountainguan测试
吗?
这是一个与这里的问题类似的问题:
但不同的是,本例中的邮件服务器支持 UTF-8 搜索,我们在 imap_search
函数中也使用 UTF-8。
我有一个这样的电子邮件主题:mountainguan测试
我想使用此 PHP 代码搜索包含此主题或部分主题的电子邮件:
$mailbox = "{any-mail.server.com:993/imap/ssl}INBOX";
$mailbox_username = "someone@server.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 "mountain"', 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: " . imap_utf8($header->fromaddress) . "\n";
echo "Subject: " . imap_utf8($header->subject) . "\n";
}
当我搜索 SUBJECT "mountain"
时,它会按预期返回电子邮件:
$ php imap-test.php
Trying to connect to '{any-mail.server.com:993/imap/ssl}'...
Found 1 email(s)...
+------ P A R S I N G ------+
From: Someone Else <someone@other-server.com>
Subject: mountainguan测试
当我现在将搜索更改为 SUBJECT "测试"
时,它返回的是:
$ php imap-test.php
Trying to connect to '{any-mail.server.com:993/imap/ssl}'...
No emails found!
相同的搜索通过 OpenSSL 进行,所以我希望它也可以与 PHP 一起使用:
openssl s_client -connect any-mail.server.com:993
a LOGIN someone@server.com *******
a OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SPECIAL-USE QUOTA] Logged in
a SELECT "inbox"
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft unknown-0 unknown-1 $NotJunk $Forwarded)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft unknown-0 unknown-1 $NotJunk $Forwarded \*)] Flags permitted.
* 9 EXISTS
* 0 RECENT
* OK [UNSEEN 9] First unseen.
* OK [UIDVALIDITY 1500057051] UIDs valid
* OK [UIDNEXT 5388] Predicted next UID
* OK [HIGHESTMODSEQ 14790] Highest
a OK [READ-WRITE] Select completed (0.000 + 0.000 secs).
a UID SEARCH SUBJECT "mountain"
* SEARCH 5387
a OK Search completed (0.001 + 0.000 secs).
a UID SEARCH SUBJECT "测试"
* SEARCH 5387
a OK Search completed (0.001 + 0.000 secs).
a UID FETCH 5387 (BODY[HEADER.FIELDS (subject date)])
* 9 FETCH (UID 5387 FLAGS (\Seen) BODY[HEADER.FIELDS (SUBJECT DATE)] {245}
Subject: =?UTF-8?Q?mountainguan=E6=B5=8B=E8=AF=95?=
Date: Sat, 4 May 2019 01:11:57 +0200
)
a OK Fetch completed (0.001 + 0.000 secs).
a logout
* BYE Logging out
a OK Logout completed (0.000 + 0.000 secs).
closed
这里使用PHP imap_search()
有什么问题?我是否需要将搜索字符串的某些内容转换/反编码或编码为其他内容?
您不必在 $mailsIds = imap_search($mbox_connection, 'SUBJECT "mountain"', SE_UID, "UTF-8");
$criteria
字符串进行编码
请检查您的 php 脚本 (imap-test.php) 的编码。可能不是UTF-8。
你能把编码转换成UTF-8然后把$criteria
改成mountainguan测试
吗?