Spedire email con Laravel 4 e Gmail

Hai bisogno di spedire le email dalla tua applicazione e vuoi appoggiarti a Gmail? Ecco come fare.
francesco
Francesco Lettera
30/04/2014 in Tutorial

Traduzione dell'articolo "Sending Emails With Laravel 4 & Gmail" su Tuts+

Spedire email è un aspetto cruciale per qualsiasi applicazione. Di solito, un email è spedita per notificare all'utente che qualcosa è successo nel sito. Per esempio, un aggiornamento o la notifica di nuovi amici. In questo piccolo tutorial vedremo come spedire email con Gmail velocemente, attraverso una semplice applicazione scritta con Laravel. Tale applicazione estenderà un'altra già esistente (che puoi trovare qui).

Cominciamo!

Configurazione del file mail

Prima di spedire email con Laravel 4 è necessario configurare il file _app/config/mail.php. _In questo file imposteremo le seguenti opzioni:

**Opzione**Decrizione
`driver`Il driver per il mailing che vorresti usare. Di default è impostato su SMTP, ma puoi anche cambiarlo nel caso tu voglia usare PHP mail o Sendmail.
`host`Questo è il tuo host SMTP.
`port`La tua porta SMTP.
`from`Questo ti permette di impostare il campo "Da" (mittente) nella tua email, in modo tale che tutte le email saranno spedite dallo stesso indirizzo.
`encryption`Questo è il protocolo di crittografia che sarà usato per spedire le email.
`username`Questa è la tua username SMTP.
`password`Questa è la tua password SMTP.
`sendmail`Questo il percorso di localizzazione Sendmail sul server, quando usi un driver sendmail.
`pretend`Se impostato a _true, _le email saranno tracciate un file di log, piuttosto che inviate come messaggi reali.

Lavorare con Gmail

In questo tutorial useremo Gmail per spedire email. Di conseguenza, tutto quello di cui abbiamo bisogno è avere un account Gmail, con username e password. Editiamo il nostro file _app/config/mail.php _(ho rimosso i commenti per rendere il codice più compatto):

return array(
 
    'driver' => 'smtp',
 
    'host' => 'smtp.gmail.com',
 
    'port' => 587,
 
    'from' => array('address' => 'authapp@awesomeauthapp. com', 'name' => 'Awesome Laravel 4 Auth App'),
 
    'encryption' => 'tls',
 
    'username' => 'your_gmail_username',
 
    'password' => 'your_gmail_password',
 
    'sendmail' => '/usr/sbin/sendmail -bs',
 
    'pretend' => false,
 
);

Ho lasciato il driver impostato in SMTP.

L'host è impostato su smtp.gmail.com che rappresenta appunto il server SMTP di Gmail. La porta è la 587, il from è un'email fake utile per la nostra applicazione.

L'indice encryption impostato su tls ed infine le credenziali Gmail e l'indice pretend impostato su false .

Spedire email

In questa applicazione manderemo un'email di benvenuto all'utente appena registrato. Per spedire email con Laravel useremo il metodo Mail::send(). Ecco qui un piccolo snippet di esempio:

Mail::send('folder.view', $data, function($message) {
    $message->to('registered-user@gmail. com', 'Jon Doe')->subject('Welcome to the Laravel 4 Auth App!');
});

Il primo argomento è il file view che vogliamo usare per formattare la nostra email. Il secondo argomento è rappresentato da qualsiasi dato vogliamo trasferire alla view. Il terzo argomento è una closure che accetta come parametro un oggetto $message. Tramite tale oggetto possiamo specificare tutti i dati relativi ad oggetto, destinatari ed altri dati relativi al messaggio.

Piuttosto semplice vero?

Spedire il messaggio dopo la registrazione

Modifichiamo adesso il nostro metodo postCreate() di UsersController in modo tale da inviare la email di benvenuto ad ogni utente che si è appena registrato. Nel nostro metodo postCreate(), nel caso in cui la validazione dei dati dovesse andare a buon fine, inseriremo i nostri dati nel db per poi spedire la nostra email:

if ($validator->passes()) {
    $user = new User;
    $user->firstname = Input::get('firstname');
    $user->lastname = Input::get('lastname');
    $user->email = Input::get('email');
    $user->password = Hash::make(Input::get('password'));
    $user->save();
 
    Mail::send('users.mails.welcome', array('firstname'=>Input::get('firstname')), function($message){
        $message->to(Input::get('email'), Input::get('firstname').' '.Input::get('lastname'))->subject('Welcome to the Laravel 4 Auth App!');
    });
 
    return Redirect::to('users/login')->with('message', 'Thanks for registering!');
} else {
    return Redirect::to('users/register')->with('message', 'The following errors occurred')->withErrors($validator)->withInput();
}

Al metodo Mail::send() daremo in pasto il file view users.mail.welcome. Il secondo argomento è rappresentato dai dati che saranno utilizzati nella view ed in questo caso sarà solo il nome. Poi creiamo la nostra closure per impostare l'email del destinatario. Possiamo anche impostare il nome usando i campi "nome" e "cognome" del form.

Infine, diamo alla closure un generico "oggetto" e il gioco è fatto.

La view del messaggio

Bene: adesso dobbiamo creare una view per l'email di benvenuto. All'interno di app/views/users creiamo una nuova cartella e chiamiamola mails. Al suo interno ci sarà un nuovo file chiamato welcome.blade.php con il seguente codice:

Hello {{ $firstname }}
<p>We'd like to personally welcome you to the Laravel 4 Authentication Application. Thank you for registering!</p>

In questo file view ci sarà un po' di codice HTML e la variabile $firstname che abbiamo introdotto come dato dal nostro controller.

Non c'è nient'altro da fare.

Facciamo una prova!

Assicuriamoci che il nostro webserver sia attivo con _php artisan serve, _poi andiamo su _http://localhost:8000/users/register, _e creiamo un nuovo utente:

laravel-auth-create-user

...poi controlliamo l'email dell'utente per verificare che sia stata effettivamente spedita:

laravel-auth-emai-sent

Perfetto, la nostra email è stata spedita.

In conclusione

Chiaramente, possiamo personalizzare il messaggio dell'email per dare maggiore appeal all'applicazione. D'altronde quello che abbiamo visto è il modo più semplice per inviare email e, sicuramente, non è il metodo più efficace quando l'applicazione è complessa e l'invio delle email diventa più frequente. In questo caso possiamo utilizzare l'opzione queue per spedire le email in background, senza far attendere i nostri utenti. Questo argomento, però, verrà trattato in un ulteriore articolo.

Ulteriori informazioni su come spedire email con Laravel nella documentazione online.