Invio di email usando Zend_Mail

Questo articolo illustra come utilizzare lo Zend Framework per realizzare un form di invio email, utile ad esempio agli utenti per contattare l'amministratore del sito oppure per segnalare una pagina del sito ad amici. Zend Framework fornisce tutti gli oggetti necessari allo scopo, oggetti che possono essere usati singolarmente, al di fuori di una applicazione MVC.
L'uso di un framework non deve spaventare coloro che non si sentono degli esperti nella programmazione in PHP. Al contrario l'utilizzo degli oggetti forniti dal framework semplifica e velocizza la realizzazione dello script.

Iniziamo con la creazione del form in HTML che permetterà di inviare i dati inseriti dall'utente tramite $_POST allo script send.php:

<form method="post" action="send.php" name="form">
<table border="0px">
<tr>
 <td style="text-align: right">
   Tuo Nome:
 </td>
 <td>
   <input type="text" name="name" size="40" maxlength="80" />
 </td>
</tr>
<tr>
 <td style="text-align: right">
   Tua Email:
 </td>
 <td>
   <input type="text" name="email" size="40" />
 </td>
</tr>
<tr>
 <td style="text-align: right">
   Oggetto:
 </td>
 <td>
   <input type="text" name="subject" size="40" maxlength="80" />
 </td>
</tr>
<tr>
 <td style="text-align: right">
   Testo:
 </td>
 <td>
   <textarea name="testo" cols="60" rows="10"></textarea>
 </td>
</tr>
<tr>
 <td>
 </td>
 <td style="text-align: right">
   <input type="submit" value="Invia" />
 </td>
</tr>
</table>
</form>

Proseguiamo con la creazione dello script send.php. Per prima cosa è bene fare un controllo sull'array $_POST. Se questo è vuoto è inutile proseguire poiché significa che l'utente non ha inviato il form, mostriamo quindi un messaggio di errore.

Il passaggio successivo sarà richiamare l'oggetto Zend_Loader_Autoloader. Questa classe permette di caricare in automatico i vari oggetti del framework senza la necessità di dover includere i singoli script del framework contenenti le classi che ci interessano.

Fatto ciò possiamo istanziare un oggetto Zend_Mail (referenziato dalla variabile $mail nello script) e comporre così l'email.

La composizione di una email a partire dai campi del form creato precedentemente è davvero semplice ed intuitiva e uno sguardo allo script send.php lo dimostra chiaramente.

Fatto ciò si deve spedire la posta. Prima però è necessario indicare a Zend_Mail con quale "trasporter" inviare la propria email, ovvero quale sistema di invio impiegare. Di default l'invio di una email avviene tramite Zend_Mail_Transport_Sendmail. Questo transporter utilizza il server sendmail impostato nella configurazione del php. Dunque per inviare l'email basterebbe utilizzare il metodo send di Zend_Mail e l'email viene inviata.
Supponiamo però di voler utilizzare un server SMTP. Per farlo ci viene in aiuto un oggetto molto interessante: Zend_Mail_Transport_Smtp. Nello script send.php si può vedere come si impostano i parametri di connessione al server SMTP.
Infine, tramite il metodo send di Zend_Mail si invia l'email indicando il "transporter" creato:

<?php
    // includo la cartella del framework
    // Attenzione, il path impostato è per server windows, se si è su un server linux il path dovrebbe essere del tipo: /directory/zendframework/library
    set_include_path(get_include_path().PATH_SEPARATOR."C:\Programmi\ZendFramework\library");
    
    /**
     * Se il form è stato riempito procedo con l'invio della email  
     */
    if($_POST){

	/**
	 * Richiamo il file contenente la mia classe Zend_Loader_Autoloader
	 *
	 * in questo modo posso caricare facilmente tutte le classi di
	 * Zend Framework agevolmente senza dover ogni volta fare un require
	 * come sto facendo ora
	 */
	require_once("Zend/Loader/Autoloader.php");
	
	$autoloader = Zend_Loader_Autoloader::getInstance();
	
	/**
	 * Istanzio il mio oggetto Zend_Mail
	 */
	$mail = new Zend_Mail();

	/**
	 *  Compongo la mia email 
	 *  impostando le varie parti dell'email
	 */
	$mail->addTo('mario@example.com', 'Mario Santagiuliana');
	
	$mail->setFrom($_POST['email'], $_POST['name']);
	$mail->setSubject($_POST['subject']);
	$mail->setBodyText($_POST['testo']);

	/**
	 *  Voglio usare il mio server smtp, imposto i
	 *  parametri di configurazione per la connessione smtp 
	 */
	$config = array('auth' => 'login',
		'username' => 'mario@example.com',
		'password' => 'la_mia_password',
		'port' => 25);
	/**
	 *  Istanzio l'oggetto Zend_Mail_Transport_Smtp indicandogli i
	 *  parametri di connessione e di accesso
	 */
	$transport = new Zend_Mail_Transport_Smtp('smtp.example.com', $config);
	
	/**
	 * Invio l'email tramite il mio server smtp appena configurato
	 * e stampo un messaggio di corretta esecuzione dello script
	 */
	$mail->send($transport);
	$messaggio = "Email inviata correttamente";
    } else {
	/**
	 * Imposto un messaggio generico di errore
	 */
	$messaggio = "Non hai riempito il form per il messaggio";
    }

    // Stampo il messaggio
    echo $messaggio;
?>

Come si può vedere la creazione dello script, utilizzando le classi di Zend è oltremodo semplice e veloce.

 

Pagine: 12

5 commenti

1 Vincenzo Vincenzo mercoledì 29 dicembre 2010, ore 22:05
ciao Mario,
innanzitutto complimenti per l'articolo.
Ho implementato nella mia web application il form contattaci.Il form come si può facilmente intuire, dovrebbe inviare un email all'indirizzo email di riferimento dell'applicazione, utilizzando con indirizzo email mittente quello specificato dal cliente nel form.
Ebbene nell'utilizzo del componente Zend_Mail, ho riscontrato il seguente problema:
Se l'indirizzo mittente cioè quello specificato su "setFrom" è lo stesso di quello utilizzato come parametro di connessione ("username") dell'oggetto Zend_Mail_Transport_Smtp, tutto funziona perfettamnte. Se invece sono diversi non funziona sollevando l'eccezione con il messaggio "MAIL".
Sai come risolvere questo problema?

Grazie anticipatamente

Ciao
2 Gianni Tomasicchio Gianni Tomasicchio mercoledì 29 dicembre 2010, ore 22:16
Probabilmente è il server SMTP che, per limitare lo spam, si rifiuta di inviare mail che hanno per mittente un utente diverso dall'utente che si è loggato.

Zend_Mail_Transport_Smtp, cominicando direttamente con il server SMTP, restituisce subito questo tipo di errori che invece, con la classica funzione mail() di PHP di presentavano in maniera più subdola, ad esempio con il fatto che la mail non veniva recapitata.

Prova ad utilizzare un altro server SMTP.
3 Vincenzo Vincenzo mercoledì 29 dicembre 2010, ore 22:36
Ho provato con Gmail, e l'email arriva, ma non riporta come mittente l'indirizzo l'email del cliente, ma quello di login. Invece il server SMTP, con il quale solleva l'eccezione è libero.it.
Conosci server SMTP che non presentano questo problema?
4 Gianni Tomasicchio Gianni Tomasicchio mercoledì 29 dicembre 2010, ore 22:40
No, ma temo che i server SMTP "pubblici" si comportino più o meno tutti così. La cosa cambia se il server SMTP lo gestisci tu...
5 Vincenzo Vincenzo mercoledì 29 dicembre 2010, ore 22:50
Ok grazie mille per le dritte.

Ciao
Effettua l'accesso o registrati per inserire un commento