Link to home
Start Free TrialLog in
Avatar of Mark
Mark

asked on

Using PHP's IMAP module with Gmail, how do I keep a script alive checking for emails every 5 seconds

The code I've been using (snippet):

while(true) {

	imap_check($connection);
	$emails = imap_search($connection,'ALL');
	

	if($emails) {

		rsort($emails);
		foreach($emails as $email_number) {
			$overview = imap_fetch_overview($connection, "{$email_number}:{$email_number}");
			$headers = imap_header($connection, $email_number);
			$replyto = $headers->reply_toaddress;
			$subject = $headers->Subject;

                       #........ code to delete email and a bunch more lines

		}
		
	}
	
	else echo "No New Emails\n";
	
	imap_gc($connection, IMAP_GC_ELT); # Clear Cache

	sleep(5);

}

Open in new window


The code works when left on for a few hours however I left it on this weekend and when I came back, it wasn't obtaining new emails (it just kept outputting "No New Emails"). When I restarted the script, it started working property...

Please advise, thanks
Avatar of gheist
gheist
Flag of Belgium image

You never check if connection is alive.
Avatar of Mark
Mark

ASKER

Could you supply the correct code then that checks as you mention and reconnects if necessary
Add imap_open/imap_close in the loop
They are outside code presented, so I hold no chance to fix it.
Avatar of Mark

ASKER

I already have imap_open but at the beginning of the script before the infinite loop begins. I don't have an imap_close tag anywhere because I want to connection to remain alive.

I don't want the script to have to reconnect to gmail's servers every 5 seconds as it will slow its performance down. The way I have it now, it works well however after a few hours it stops working (I was even going to add a while ($loopCount<x) but that doesn't seem like the right way togo.

I assumed when building the script that imap_search would throw an error of it's no longer connected to a the server but that doesn't seem to be the case (or gmail has some sort of limits)
if imap_check()
 ... do your loop
else imap_close/imap_open
Avatar of Mark

ASKER

I, what about imap_ping .. Any use with that in this instance
ASKER CERTIFIED SOLUTION
Avatar of gheist
gheist
Flag of Belgium image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
if !(imap_check()) then
 reconnect
fi
doyour loop