PHP imap_search: символы UTF-8 / не ASCII на почтовых серверах Microsoft Exchange - PullRequest
2 голосов
/ 04 мая 2019

Я хочу получать письма от outlook.office365.com, используя IMAP и PHP.

Так как большинство электронных писем содержат символы не ASCII, такие как äöü, я использую UTF-8 в моей функции imap_search():

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")

Теперь он возвращает все ожидаемые невидимые (непрочитанные) электронные письма.

Проблема в том, что я не могу искать электронные письма с символами UTF-8. Я, например, письмо с такой информацией:

  • От: Äpfel Nürnberg
  • Тема: Апфель против Апфеля
  • Тело:
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";
}

Я уже пробовал это решение, но при этом также не появляется соответствующий адрес электронной почты:

$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 и Body, когда сервер IMAP не поддерживает UTF-8, и я также не могу изменить это на сервере- боковая конфигурация?

Это, похоже, проблема со всеми серверами Microsoft Exchange. Насколько я мог узнать через Google, эта проблема существует только на тех серверах.

1 Ответ

2 голосов
/ 04 мая 2019

Вы, вероятно, не можете.

Похоже, что Exchange не поддерживает поиск IMAP с помощью кодировки, и это не является обязательным требованием RFC3501 (должна поддерживаться только US-ASCII). UTF-8 обычно поддерживается, но, похоже, это не относится к Exchange.

Вам придется переключать протоколы (EAS, EWS, REST-сервисы и т. Д.) Или извлекать информацию, самостоятельно ее декодировать и искать. Если вы кешируете это, это не так уж плохо в долгосрочной перспективе. Поскольку это заголовки, вы можете получить все это за один раз. Если вам нужно искать тела, дело гораздо сложнее.

...