Я хочу получать письма от 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, эта проблема существует только на тех серверах.