PHP imap_search:搜索UTF-8 /支持UTF-8的非ASCII字符

时间:2019-06-01 19:05:50

标签: php email utf-8 character-encoding imap

这与这里的问题类似:PHP imap_search: UTF-8 / Non-ASCII characters on Microsoft Exchange mail servers

但有区别的是,在这种情况下,邮件服务器支持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()有什么问题?我是否需要将搜索字符串中的某些内容转换/解编或编码为其他内容?

1 个答案:

答案 0 :(得分:1)

您不必在$criteria处对$mailsIds = imap_search($mbox_connection, 'SUBJECT "mountain"', SE_UID, "UTF-8");字符串进行编码

请检查您的php脚本(imap-test.php)的编码。可能不是UTF-8。 您可以将编码转换为UTF-8,然后将$criteria更改为mountainguan测试吗?