Мне нужно искать сообщения Gmail (приложения Google для работы) через imap / php. Тем не мение, критерии imap_search не достаточно, чтобы поймать сообщения, о которых идет речь.
Код, который я использую, выглядит следующим образом:
$imap = imap_open("{imap.gmail.com:993/imap/ssl}Label1/label2", $user_email, $user_passwd);
$msg_list = imap_search($imap, 'TEXT "Delivered-To: [email protected]"');
imap_close($imap);
Вызов imap_search ничего не возвращал.
Я провел некоторое исследование, кажется, я могу фильтровать сообщения на основе поля заголовка «Доставлено» через синтаксис поиска в Gmail X-GM-RAW
, но я просто не смог этого добиться, я попробовал все эти звонки (и не только):
$msg_list = imap_search($imap, 'UID SEARCH X-GM-RAW "deliveredto:[email protected]"');
$msg_list = imap_search($imap, 'SEARCH X-GM-RAW "deliveredto:[email protected]"');
$msg_list = imap_search($imap, 'X-GM-RAW "deliveredto:[email protected]"');
Но это не сработало, кто-нибудь знает, что не так с моим кодом?
Хорошо, либо я не знаю, как задавать вопросы, те, кто занят, либо я задаю сложные вопросы.
В любом случае, теперь я знаю, что встроенные в PHP функции imap_ * не обрабатывают прямые команды IMAP, поэтому мне пришлось либо использовать Zend Framework (слишком тяжелый для моих нужд), либо напрямую подключиться к imap через сокеты.
Я выбрал второй вариант, код выглядит следующим образом (код, украденный отсюда и адаптированный для моих собственных нужд), если кому-то это нужно:
<?php
// Open a socket
if (!($fp = fsockopen('ssl://imap.gmail.com', 993, $errno, $errstr, 15))) die("Could not connect to host");
// Set timout to 1 second
if (!stream_set_timeout($fp, 1)) die("Could not set timeout");
// Fetch first line of response and echo it
echo fgets($fp);
// =========================================
fwrite($fp, "0001 LOGIN [email protected] YOUR_PASSWORD_HERE_WITHOUT_QUOTES\r\n");
// ie. fwrite($fp, "0001 LOGIN [email protected] pass123\r\n");
// Keep fetching lines until response code is correct
while ($line = trim(fgets($fp)))
{
echo "Line = [$line]\n";
$line = preg_split('/\s+/', $line, 0, PREG_SPLIT_NO_EMPTY);
$code = $line[0];
if (strtoupper($code) == '0001') {
break;
}
}
// =========================================
fwrite($fp, "0002 SELECT Inbox\r\n");
// Keep fetching lines until response code is correct
while ($line = trim(fgets($fp)))
{
echo "Line = [$line]\n";
$line = preg_split('/\s+/', $line, 0, PREG_SPLIT_NO_EMPTY);
$code = $line[0];
if (strtoupper($code) == '0002') {
break;
}
}
// =========================================
fwrite($fp, "0003 SEARCH X-GM-RAW \"deliveredto:[email protected]\"\r\n");
// Keep fetching lines until response code is correct
while ($line = fgets($fp))
{
echo "Line = [$line]\n";
$line = preg_split('/\s+/', $line, 0, PREG_SPLIT_NO_EMPTY);
$code = $line[0];
if (strtoupper($code) == '0003') {
break;
}
}
fclose($fp);
echo "I've finished!";
?>
Вуаля! Просто скопируйте и вставьте, и теперь у вас есть доступ к синтаксису Gmail прямо из PHP! (Привет, голосуй, если хочешь: р)
Других решений пока нет …