IMAP, ongelezen berichten uitlezen

Door 11 december 2012Tips & Trucs

Enige tijd geleden ben ik begonnen met een project waarbij iedereen zijn eigen startpagina kan maken. Hierbij moest het mogelijk zijn om websites als favorieten en email adressen toe te voegen. De website worden vervolgens uitgelezen om eventueel aanwezige RSS feeds te detecteren om aan te geven of er nieuwe berichten zijn. Voor de toegevoegde email adressen wordt aangegeven of er nieuwe email berichten zijn. Soms wil je teveel en zo was ik zelfs bezig met Dropbox integratie om ook je bestanden bij de hand te hebben. Dit zou dan later uitgebreid worden met andere cloud opslag aanbieders.

Al met al ben ik aardig ver gekomen maar onder andere door tijdsgebrek het project niet afgerond. Ik moet zeggen dat het wel nog steeds mijn eigen startpagina is!

Startox screenshot

Uiteraard moeten alle email providers ondersteund worden. Middels de imap_open functie gaat dat perfect natuurlijk!

$inbox = imap_open($hostname,$username,$password);

Waarbij we in het geval van Gmail als hostname het volgende gebruiken:

$hotname = '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX';

Vervolgens de imap_status functie om erachter te komen hoeveel ongelezen email berichten er zijn:

$emails = imap_status($inbox,$hostname,SA_UNSEEN);
echo $emails->unseen.' ongelezen berichten';

En klaar!

Let wel op dat bij POP we hier alle aanwezige email berichten krijgen!

Maar waarvoor ik dit artikel eigenlijk schrijf is omdat het helaas niet overal zo simpel gaat. Lang leve Gmail natuurlijk! Wat wordt daar nu niet ondersteund? Maar wanneer ik een Exchange email adres toevoeg kwamen de problemen. De eerste foutmelding:

Kerberos error: No credentials cache found (try running kinit) for ***.nl

Met veel gezoek en de uiteindelijke update naar PHP 5.3 is het werkend te krijgen met de DISABLE_AUTHENTICATOR als parameter bij imap_open:

$inbox = imap_open($hostname,$username,$password, NULL,1,array('DISABLE_AUTHENTICATOR' => 'GSSAPI'));

Top melding weg! Maar dan blijkt dat Exchange geen “unseen” flag heeft bij een mailbox. Om ook dat probleem op te lossen is het een optie om door alle berichten te “loop’en” en te kijken of deze al gelezen is. Gelukkig heeft PHP daar ook wat moois voor! imap_search!

$emails = imap_search($inbox,'UNSEEN');

echo count($emails).' ongelezen berichten';

Om er wat bruikbaars van te maken:


//Instellingen
$hostname = '{***.nl:993/imap/ssl/novalidate-cert}INBOX';
$username = '[email protected]';
$password = '';

//Open verbinding
$inbox = imap_open($hostname,$username,$password, NULL,1,array('DISABLE_AUTHENTICATOR' => 'GSSAPI'));

//Ongelezen berichten uitlezen van de mailbox
$emails = imap_status($inbox,$hostname,SA_UNSEEN);

//Geeft de mailbox dit mee?
if(isset($emails->unseen)){
	$ongelezen = $emails->unseen;
} else {
	//Ongelezen berichten zoeken
	$emails = imap_search($inbox,'UNSEEN');
	$ongelezen = count($emails);
}

//Ongelezen berichten?
if($ongelezen)
{
	//POP email adres?
	if(strpos($hostname,'pop')){
		echo $ongelezen.' berichten';
	} else {
		echo $ongelezen.' ongelezen berichten';
	}
} else {
	echo 'Geen nieuwe berichten!';
}