Scansione allegati di una casella IMAP in PHP

Come monitorare una casella di posta in attesa di allegati che rispettino un determinato pattern? Ad esempio, potremmo voler permettere di inviare su una casella un file per l’archiviazione elettronica oppure per essere elaborato automaticamente.
Si può fare molto semplicemente sfruttando le funzioni IMAP di PHP. Ecco un esempio di come aprire una casella:

$hostname = '{imap.gmail.com:993/imap/ssl}INBOX'; // accedo al server IMAP, ad esempio GMAIL
$username = 'YOUR_GMAIL_USERNAME'; # e.g somebody@gmail.com
$password = 'YOUR_GMAIL_PASSWORD';
 
$inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Gmail: ' . imap_last_error()); // apro la connessione
 
$emails = imap_search($inbox,'ALL'); // recupero le email (nota: anche quelle marcate come cancellate)
 
if($emails) 
{ 
    $count = 1;
    rsort($emails); // ordino le email

    foreach($emails as $email_number) 
    {
        $overview = imap_fetch_overview($inbox,$email_number,0); // recupero le informazioni della mail
 
...

A questo punto, ottenute le informazioni sulla singola email, possiamo accedere all’allegato:

...
if(isset($structure->parts) && count($structure->parts)) 
{
	for($i = 0; $i parts); $i++) 
	{
		$attachments[$i] = array(
			'is_attachment' => false,
			'filename' => '',
			'name' => '',
			'attachment' => ''
		);

		if($structure->parts[$i]->ifdparameters) 
		{
			foreach($structure->parts[$i]->dparameters as $object) 
			{
				if(strtolower($object->attribute) == 'filename') 
				{
					$attachments[$i]['is_attachment'] = true;
					$attachments[$i]['filename'] = $object->value;
				}
			}
		}

		if($structure->parts[$i]->ifparameters) 
		{
			foreach($structure->parts[$i]->parameters as $object) 
			{
				if(strtolower($object->attribute) == 'name') 
				{
					$attachments[$i]['is_attachment'] = true;
					$attachments[$i]['name'] = $object->value;
				}
			}
		}

		if($attachments[$i]['is_attachment']) 
		{
			$attachments[$i]['attachment'] = imap_fetchbody($inbox, $email_number, $i+1);

			/* 4 = QUOTED-PRINTABLE encoding */
			if($structure->parts[$i]->encoding == 3) 
			{ 
				$attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
			}
			/* 3 = BASE64 encoding */
			elseif($structure->parts[$i]->encoding == 4) 
			{ 
				$attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
			}
		}
	}
}

/* iterate through each attachment and save it */
foreach($attachments as $attachment)
{
	if($attachment['is_attachment'] == 1)
	{
		$filename = $attachment['name'];
		if(empty($filename)) $filename = $attachment['filename'];

		if(empty($filename)) $filename = time() . ".dat";

		/* prefix the email number to the filename in case two emails
		 * have the attachment with the same file name.
		 */
		$fp = fopen($email_number . "-" . $filename, "w+");
		fwrite($fp, $attachment['attachment']);
		fclose($fp);
	}
}
...

I file verranno salvati nella cartella locale di PHP, verificare di avere i permessi necessari.
Trovate il codice completo a questo link.

Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...