PHP imap_search: поиск символов UTF-8 / не ASCII с поддержкой UTF-8 - PullRequest
1 голос
/ 01 июня 2019

Этот вопрос похож на этот: PHP imap_search: символы UTF-8 / не ASCII на почтовых серверах Microsoft Exchange

Но с той разницей, что почтовый серверв этом случае поддерживается поиск по UTF-8, и мы также используем UTF-8 в функции imap_search.

У меня есть тема электронного письма, подобная этой: 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 Ответ

1 голос
/ 19 июня 2019

Вам не нужно кодировать $criteria строку в $mailsIds = imap_search($mbox_connection, 'SUBJECT "mountain"', SE_UID, "UTF-8");

Пожалуйста, проверьте кодировку вашего php-скрипта (imap-test.php).Вероятно, это не UTF-8.Не могли бы вы преобразовать кодировку в UTF-8, а затем изменить $criteria на mountainguan测试?

...