Hej
Napisałem prosty skrypcik w PHP który korzysta z biblikiteki php-imap i ma za zadanie znaleść w mojej skrzynce wszystkie maile powiedzmy od Allegro. Użyłem takiego kodu:
<?php $mbox = imap_open("{imap.poczta.onet.pl:993/imap/ssl}", "mojlogin@onet.pl", "haslo"); c1 = imap_search($mbox, 'SINCE "8 August 2022"', SE_UID); http://www.php.net/var_dump($c1); ?>
<?php $mbox = imap_open("{imap.poczta.onet.pl:993/imap/ssl}", "mojlogin@onet.pl", "haslo"); $c2 = imap_search($mbox, 'BODY "allegro"', SE_UID, "UTF-8"); http://www.php.net/var_dump($c2); ?>
Z https://www.php.net/manual/en/function.imap-search.php:
Return false if it does not understand the search criteria or no messages have been found.
Swoją drogą, dlaczego użyłeś 'BODY', a nie 'SUBJECT' albo 'FROM'?
Dla SUBJECT też zwraca false. Jak to debugować? Skąd mam wiedzieć czy to funkcja, czy serwer Onetu nie zrozumiał mojego wyszukiwania?
W https://www.php.net/manual/en/function.imap-search pisze, że trzeci argument to flags i może przyjmować taką wartość jak w przykładzie.
Zresztą:
$uids = imap_search($mbox, 'ALL', SE_UID, "UTF-8"); http://www.php.net/var_dump($uids);
Nie korzystałem, ale ta jest chyba najbardziej aktualna i wciąż utrzymywana:
https://github.com/ddeboer/imap
Natknąłem się na tę bibliotekę jak sam googlowałem. Przykładowy kod z jej wykorzystaniem:
<?php include("vendor/autoload.php"); use Ddeboer\Imap\Server; use Ddeboer\Imap\SearchExpression; use Ddeboer\Imap\Search\Email\From; use Ddeboer\Imap\Search\Text\Body; use Ddeboer\Imap\Search\Text\Keyword; use Ddeboer\Imap\Search\Text\Subject; use Ddeboer\Imap\Search\Text\Text; $server = new Server('imap.poczta.onet.pl'); $connection = $server->authenticate('login@onet.pl', 'haslo'); $mailboxes = $connection->getMailboxes(); foreach ($mailboxes as $mailbox) { // Skip container-only mailboxes // @see https://secure.php.net/manual/en/function.imap-getmailboxes.php if ($mailbox->getAttributes() & \LATT_NOSELECT) { continue; } if($mailbox->getName() == "Społeczności") { http://www.php.net/echo $mailbox->count(); $search = new SearchExpression(); $search->addCondition(new Body('contents')); $messages = $mailbox->getMessages($search); http://www.php.net/printf($messages->count()."\n"); if($messages) { <------>foreach ($messages as $message) { <------> $message->getBodyText(); <------>} } } } ?>
Najlepiej, to odpalić xdebuga i przejść krok po kroku co się dzieje pod spodem.
Błąd dotyczy linii 139, ale sam Exception jest dopiero w linii 157...
https://github.com/ddeboer/imap/blob/master/src/Mailbox.php#L155
Pogadałem sobie z Onetem przez telnet i w taki sposób też nie udało mi się przeszukać skrzynki. Postanowiłem podejśc do zagadnienia inaczej. Szukam na moim koncie dwóch interesujacych mnie skrzynek pocztowych - Społeczności i odebrane (INBOX). Pobieram 50 najnoszywch wiadomosci i sprawdzam, czy wśród nich jest coś od Allegro. Stworzyłem taki kod:
$provider['mailboxes'] = http://www.php.net/array('Społeczności', 'INBOX'); $any_valid_mailbox = false; $mailboxes = $connection->getMailboxes(); //debug("Znalezione mailboxy:\n"); //var_dump($mailboxes); foreach($mailboxes as $found_mailbox) { foreach($provider['mailboxes'] as $valid_mailbox) { debug("Czy jest tu ".$valid_mailbox); if($found_mailbox->getName() == $valid_mailbox) { $any_valid_mailbox = true; // Sprawdź ile w tym mailboxie wiadomosci, przeszukaj nie więcej niż MAX_MESSAGES najświeższych $messages = $found_mailbox->getMessages($search); $msg_count = $messages->count(); http://www.php.net/var_dump($messages); debug("Jest $valid_mailbox z $msg_count wiadomościami !!!"); } } }
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)