[php] Pobieranie maili funkcjami imap_* [timeout]

0

Witam

Od pewnego czasu męczę się z pobraniem podstawowych informacji o mailach w PHP korzystając z POP3.
Korzystam z funkcji imap_*, które obsługują również POP3.

Problem w tym, że przez POP3 zawsze pobierane są wszystkie maile a nie tylko nowe - dlatego zmuszony byłem wyciąć zachowane na serwie maile aby przyspieszyć i tak strasznie wolne ściąganie informacji o mailach.

Drugim problemem jest to, że zawsze ściąga się cały mail a nie sam nagłówek - dochodzi do tego, że jeśli np. w pierwszej skrzynce, pierwszy mail będzie spory, np. 2MB to dostanę "Fatal error: Maximum execution time of 30 seconds exceeded" i skrypt się zakończy - więc nie spełni swojej funkcji (pokazanie nowych maili).

Pomijam już, że koszmarnie długo trwa sprawdzanie nowych maili (nawet jak nie ma żadnych), ale dlaczego nie można ściągnąć samych nagłówków?

Próbowałem zarówno tak:

$headers = imap_headers($mbox);
if ($headers == false)
	echo "Call failed<br />\n";
else
	foreach($headers as $header)
		print "$header<br>\n";
}

jak i tak (z tego korzystam bo jest bardziej elastyczne):

$num = imap_num_msg($mbox)
for ($i = $num; $i >= 1; $i--)
{
	$naglowek = imap_headerinfo($mbox, $i, 80, 80);
	//tu wyświetlam niektóre pola $naglowek
}

Samo łączenie wygląda tak:

$mbox = imap_open('{poczta.interia.pl:110/pop3}INBOX', 'jakis user', 'jakies haslo');

Więc w sumie mam 2 pytania:
ważniejsze: jak ściągnąć tylko informacje o mailach tak aby duża treść któregoś nie powodowała timeout?

drugorzędne: jak ściągnąć tylko nowe maile lub nowsze od jakiejś daty? Jest funkcja

imap_search($mbox, 'SINCE 05-Jul-2005');

lecz działa tylko przy połączeniu IMAP a nie POP3 (niestety, większość serwerów nie obsługuje IMAP dlatego to nie wchodzi w rachubę :/).

Również zwiększenie czasu timeout dla php nie jest rozwiązaniem, bo mogę nie mieć możliwości tego zmienić (na jakimś serwerze z php).

Czekam na propozycje :)

0

Problem ten jest znany, nawet w komentarzach na php.net sa wyrazne dysonanse miedzy uzytkownikami - jedni twierdza, ze pobierany jest caly mail, inni przedstawiaja dowody, ze jednak tylko naglowki.

W teorii, imap_headers() pobiera tylko naglowki, moim zdaniem jednak zapisuje zalaczniki do /tmp. Tresc nie powinna miec tutaj znaczenia, bo do jej pobrania jest przeciez imap_body(), w ktorym podajemy nawet identyfikator polaczenia.

Nic Ci zatem nie pomoglem :(.

Marooned napisał(a)

drugorzędne: jak ściągnąć tylko nowe maile lub nowsze od jakiejś daty?

imap_num_recent() ? Argumentow w postaci daty tu nie podasz - funkcja pobiera nigdy "nie tykane" maile, co ma swoje plusy bo nie uzyskamy, ze tak powiem - dziury w Inboksie.

Podziel sie rozwiazaniem, jak do czegos dojdziesz :).

0
roSzi napisał(a)

imap_num_recent() ? Argumentow w postaci daty tu nie podasz - funkcja pobiera nigdy "nie tykane" maile, co ma swoje plusy bo nie uzyskamy, ze tak powiem - dziury w Inboksie.
Dość dużo pracowałem i szukałem przed zadaniem pytania - tą funkcją też się interesowałem, ale... ona też ściąga wszystkie dostępne maile :/.

1 użytkowników online, w tym zalogowanych: 0, gości: 1