- Tue
- 7
- Oct
- 08
Componente Zend_Mail ( applicazione reale Zend Framework p.11 )
Di in Php, Zend Framework Controls: +-close
Inviare email con Zend_Mail
In questo articolo parleremo del componente Zend_Mail, illustrando alcune delle sue peculiarità ed implementando nella nostra applicazione di prova un semplicissimo form dei contatti.
Zend_Mail per molti aspetti ricorda molto Php Mailer ( chi non l’ha usato? ) e come questo ci semplifica molto il lavoro quando abbiamo a che vedere con l’invio di email. Con Zend_Mail possiamo scegliere di inviare usando sendmail e il mailserver locale ( che a sua volta utilizza la funzione mail() di Php ) o utilizzando un account SMTP. Se lavorate in locale il mio consiglio è di utilizzare un account SMTP, personalmente sono riuscito ad inviare in locale utilizzando il mio account su libero.it. Ma vediamo il codice da utilizzarsi per entrambe questi metodi:
Sendmail
$mail = new Zend_Mail();
$mail->setFrom('supporto@somewebsite.com', 'Sender');
$mail->addTo('somename@someothersite.com', 'Receiver');
$mail->setSubject('Oggetto della email');
$mail->setBodyText('Corpo della mail.');
$mail->send();
SMTP
$dati = array(
'username' => 'myusername',
'password' => 'mypassword'
);
$transport = new Zend_Mail_Transport_Smtp('mail.our-smtp-server.com', $dati);
Zend_Mail::setDefaultTransport($transport);
// Segue stesso codice di sendmail
Implementazione
Ciò che andremo ad implementare potrebbe essere una buona base per la creazione di un ticket system, creeremo un form con il quale gli utenti potranno contattare il team di supporto. Ogni richiesta sarà salvata sul database, e la tabella che conterrà questi dati è la seguente:
CREATE TABLE `supporto` (
`id` int(11) unsigned NOT NULL auto_increment,
`tipo` enum('generale','errore') collate utf8_unicode_ci NOT NULL default 'generale',
`priorita` smallint(3) NOT NULL,
`stato` enum('aperto','elaborazione','chiuso') collate utf8_unicode_ci NOT NULL default 'aperto',
`titolo` varchar(99) collate utf8_unicode_ci NOT NULL,
`corpo` text collate utf8_unicode_ci NOT NULL,
`corpo_formattato` text collate utf8_unicode_ci NOT NULL,
`inserimento_data` datetime NOT NULL,
`inserimento_user_id` int(11) NOT NULL,
`inserimento_ip` varchar(15) collate utf8_unicode_ci NOT NULL,
`modifica_data` timestamp NULL default NULL on update CURRENT_TIMESTAMP,
`modifica_user_id` int(11) default NULL,
`modifica_ip` varchar(15) collate utf8_unicode_ci default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
Un nuovo controller gestirà le richieste di supporto, il controller Supporto:
class SupportoController extends Zend_Controller_Action
{
public function init(){
// codice per la gestione layout e controllo acl
}
public function indexAction(){}
public function createAction(){
$filterInt = new Zend_Filter_Int;
$filterStripTags = new Zend_Filter_StripTags;
$filterFormat = new Zend_Filter;
$filterFormat->addFilter(new Zend_Filter_StripTags)
->addFilter(new ThirdParty_Filter_Markdown);
$support = new Supporto;
$newSupport = $support->createRow();
$newSupport->inserimento_user_id = Zend_Auth::getInstance()->getIdentity() !== null ? Zend_Auth::getInstance()->getIdentity()->id : 0;
$newSupport->tipo = $filterStripTags->filter($this->_getParam('tipo'));
$newSupport->priorita = $filterInt->filter($this->_getParam('priorita'));
$newSupport->stato = $filterStripTags->filter($this->_getParam('stato'));
$newSupport->titolo = $filterStripTags->filter($this->_getParam('titolo'));
$newSupport->inserimento_data = date('Y-m-d H:i:s');
$newSupport->corpo = $filterStripTags->filter($this->_getParam('corpo'));
$newSupport->corpo_formattato = $filterFormat->filter($this->_getParam('corpo'));
$id = $newSupport->save();
$this->_redirect('supporto');
}
}
La action ‘create’ istanzia tutti i filtri necessari al filtraggio dei dati inviati dal form. Uno di questi filtri è Php Markdown, una classe open source che potete scaricare cliccando qui. Per includere questa classe in Zend Framework creiamo la classe ThirdParty_Filter_Markdown, locata in library/ThirdParty/Filter, dove includeremo anche la classe Markdown, rinominandola MarkdownExtra.php.
class ThirdParty_Filter_Markdown implements Zend_Filter_Interface
{
public function filter($string){
$parser = new MarkdownExtra_Parser;
return $parser->transform($string);
}
}
I dati vengono inseriti nel database dal metodo ’save’ chiamato da una istanza di Zend_Db_Table_Row_Abstract, nel nostra caso il modello Ticket, la classe row level del modello Supporto ( che tra poco vedremo ), istanziata tramite la chiamata del metodo createRow di Supporto. La indexAction non fa nulla, tranne che renderizzare il contenuto del relativo file della vista, index.phtml, ovvero il form che invierà i dati.
script/supporto/index.phtml
<div id="supporto">
<form action="<?php echo $this->baseUrl;?>/supporto/create" method="post">
<fieldset>
<legend>Richiesta di supporto</legend>
<label for="tipo">Tipo [*]</label><select name="tipo"><option value="generale">Generale</option><option value="errore">Errore</option></select><br />
<label for="priorita">Priorità [*]</label><select name="priorita"><option value="1">Highest</option><option value="2">High</option><option value="3">Normal</option><option value="4">Low</option><option value="5">Lowest</option></select><br />
<label for="titolo">Titolo [*]</label><input type="text" name="titolo" value="" /><br />
<textarea name="corpo" rows="12" cols="12"></textarea>
<input type="submit" value="Invia" />
</fieldset>
</form>
</div>
I Modelli
L’omonimo modello Supporto conterrà la reference map relativa alla tabella utenti e, come già detto, avrà una classe row level chiamata Ticket, dove effettueremo un overload del metodo save in modo tale che, oltre che salvare i dati nel database, si occupi anche di inviare la email.
models/Supporto.php
class Supporto extends Zend_Db_Table_Abstract
{
protected $_name = 'supporto';
protected $_rowClass = 'Ticket';
protected $_referenceMap = array(
'Supporto' => array(
'columns' => array('inserimento_user_id'),
'refTableClass' => 'Utenti',
'refColumns' => array('id')
)
);
}
models/Ticket.php
class Ticket extends Zend_Db_Table_Row_Abstract
{
public function save(){
parent::save();
SupportoMailer::send($this);
}
}
Il metodo save() effettuerà il salvataggio dei dati inviati dal form ed invierà le email, ma il codice di invio sarà incluso in una nuova classe modello che chiameremo SupportoMailer, questo più che altro per agevolare l’eventuale modifica futura del codice di invio email. L’argomento passato, $this, è una istanza di Zend_Db_Table_Row_Abstract e conterrà tutti i dati inviati dal form.
models/SupportoMailer.php
class SupportoMailer
{
public static function send(Zend_Db_Table_Row_Abstract $Ticket){
if(Zend_Auth::getInstance()->getIdentity() !== null){
$utenti = new Utenti();
$utenti->find(Zend_Auth::getInstance()->getIdentity()->id);
$submitter = $utenti->current();
}
$view = Zend_Layout::getMvcInstance()->getView();
$authDetails = array(
'port' => 25,
'username' => 'myusername',
'password' => 'mypassword'
);
$view->ticket_id = $Ticket->id;
$view->user_name = isset($submitter) ? $submitter->username : 'Unknown';
$view->mail_body = $Ticket->corpo_formattato;
$transport = new Zend_Mail_Transport_Smtp('some.smtp.com',$authDetails);
Zend_Mail::setDefaultTransport($transport);
$mail = new Zend_Mail();
$mail->addHeader('X-Priority', $Ticket->priorita, false);
//$mail->setBodyText(Zend_Layout::getMvcInstance()->getView()->render('supporto/text-email.phtml'));
$mail->setBodyHtml($view->render('supporto/html-email.phtml'));
$mail->setFrom('supporto@somewebsite.com', 'Sender');
$mail->addTo('somename@someothersite.com', 'Receiver');
if(isset($submitter)){
$mail->addCC($submitter->email, $submitter->username);
}
$mail->setSubject(strtoupper($Ticket->tipo).': '.$Ticket->titolo);
$mail->send();
}
}
SupportoMailer, in questo caso, utilizzerà un account smtp per inviare la mail al destinatario. Già, ma il destinatario una volta ricevuta la mail, cosa visualizzerà? A questa problematica ci viene incontro Zend_View: infatti, come layout della email possiamo utilizzare un view file passandolo come argomento al metodo setBody di Zend_Mail. Possiamo creare diversi layout, per esempio uno che utilizzi la formattazione html ed uno solamente testuale, questa funzionalità che sarebbe utile nel caso della creazione di una newsletter che dia all’utente la possibilità di scegliere tra l’una e l’altra.
script/supporto/html-email.phtml
<p>Ciao <b><?php echo $this->user_name; ?></b>,</p> <p>Il tuo ticket è il numero <b><?php echo $this->ticket_id; ?></b></p> <p>La tua richiesta: </p> <i><?php echo $this->mail_body; ?> </i> <p>Prenderemo in esame la tua richiesta il prima possibile.</p> <p>Grazie, </p> <p><b>lo Staff. </b></p>
script/supporto/text-email.phtml
Ciao <?php echo $this->user_name; ?>, Il tuo ticket è il numero <?php echo $this->ticket_id; ?> La tua richiesta: <?php echo $this->mail_body; ?> Prenderemo in esame la tua richiesta il prima possibile. Grazie, lo Staff.
Tralasciamo volontariamente la creazione del css per la visualizzazione del form che credo nn sia un problema.
Si conclude qui l’articolo relativo all’invio di email con Zend_Mail, non tutte le funzionalità sono state viste ( come del resto Sempre succede ), come per esempio l’aggiunta di allegati. Per ulteriori informazone vi rimando alla documentazione ufficiale.
Related posts:
- Zend Framework: introduzione al componente Zend_Form Creare form web con Zend Form Con Zend Framework possiamo...
- Zend Framework: gestione dei moduli ed esempio modulo di amministrazione Come usare Zend_Layout per la gestione dei moduli In quest'articolo...
- Zend Framework: Zend_Form con ReCaptcha Utilizzare il webservice ReCaptcha per validare i form ReCaptcha è...
- Inviare email PHP in modo semplice e veloce usando la classe PhpMailer In formato testo semplice o HTML, con o senza allegati...
Related posts brought to you by Yet Another Related Posts Plugin.












[...] Zend Framework e Zend_Mail con esempio di invio email [...]