Configurare Laravel per l'invio email con GMail

Il Framework Laravel fornisce diversi driver per l'invio di email, tramite SMTP, Mailgun, Postmark, Sendmail etc.

Pubblicato da ,
Ultima modifica

Per impostazione predefinita Laravel usa come configurazione per l'invio email "smtp", tale configurazione si trova nel file config\mail.php che di default è simile a questa

config\mail.php

<?php

return [
   

      'default' => env('MAIL_MAILER', 'smtp'),
  
        ...................
        ...................
  
      'mailers' => [
        'smtp' => [
            'transport' => 'smtp',
            'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
            'port' => env('MAIL_PORT', 587),
            'encryption' => env('MAIL_ENCRYPTION', 'tls'),
            'username' => env('MAIL_USERNAME'),
            'password' => env('MAIL_PASSWORD'),
            'timeout' => null,
            'local_domain' => env('MAIL_EHLO_DOMAIN'),
        ],
		
        ...................
        ...................
	],
	
        ...................
        ...................
	
];

in particolare facciamo riferimento alla versione 9 del framework.

Se disponiamo già di un account Google, allora colleghiamoci a questa pagina

myaccount.google.com

ed effettuiamo il login, nella sezione "Sicurezza" accessibile dal menù a sinistra

 

sicurezza account google

 

attiviamo la "Verifica in due passaggi"

 

verifica in due passaggi account google

 

sempre da "Verifica in due passaggi" scorriamo fino in fondo alla pagina e andiamo nella sezione "Password per le app"

 

password per le app

 

generiamo una password per la nostra app a cui diamo un nome, la password generata è una stringa, prendiamo nota di questa password perchè la useremo al posto di quella del nostro account GMail nella configurazione di Laravel.

Adesso modifichiamo il file .env come segue

.env

MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USERNAME=example@gmail.com
MAIL_PASSWORD=password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=example@gmail.com
MAIL_FROM_NAME="${APP_NAME}"

"example@gmail.com" è la nostra email dell'account GMail, "password" è la password che abbiamo generato prima nella sezione "Verifica in due passaggi" del nostro account Google, quindi modifichiamo questi valori con i nostri, modifichiamo anche la chiave "smtp" del file config\mail.php

config\mail.php

<?php

        ...................
        ...................
		

    'smtp' => [
       'transport' => 'smtp',
       'host' => env('MAIL_HOST'),
       'port' => env('MAIL_PORT'),
       'encryption' => env('MAIL_ENCRYPTION'),
       'username' => env('MAIL_USERNAME'),
       'password' => env('MAIL_PASSWORD'),
       'timeout' => null,
       'local_domain' => env('MAIL_EHLO_DOMAIN'),
     ],
		
		
        ...................
        ...................

Generiamo adesso la classe per definire le impostazioni della email tramite CLI usando il comando php artisan, diamo un nome a questa classe, in questo esempio è SendEmailGmail, quindi lanciamo il seguente comando

php artisan make:mail SendEmailGmail

verrà generata una classe SendEmailGmail in \app\Mail\ simile a questa

SendEmailGmail.php

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;

class SendEmailGmail extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Get the message envelope.
     *
     * @return \Illuminate\Mail\Mailables\Envelope
     */
    public function envelope()
    {
        return new Envelope(
            subject: 'Send Email Gmail',
        );
    }

    /**
     * Get the message content definition.
     *
     * @return \Illuminate\Mail\Mailables\Content
     */
    public function content()
    {
        return new Content(
            view: 'view.name',
        );
    }

    /**
     * Get the attachments for the message.
     *
     * @return array
     */
    public function attachments()
    {
        return [];
    }
}

questa classe di default è composta da tre funzioni, in envelope() è definito l'oggetto della email, in content() è definito il contenuto della email e in attachments() eventuali allegati della email, per ora lasciamo questa classe così com'è poi dopo faremo le opportune modifiche.

Creiamo il contenuto della email in \resources\views\mail\email.blade.php, la cartella mail non esiste nell'applicazione di default di Laravel, quindi creiamola noi e salviamoci questo file col seguente contenuto

email.blade.php

This is an email Sent with Gmail ☺

creiamo anche le pagine da visualizzare quando la email è inviata con successo oppure si verifica un errore, quindi in \resources\views\mail\ creiamo due file success.blade.php e error.blade.php

success.blade.php

&Sqrt; Email Successfully Sent

e

error.blade.php

An error occurred while sending the email!

avremo quindi una struttura come questa

 

 

modifichiamo la classe SendEmailGmail per indicare il contenuto corretto della email nella funzione content()

SendEmailGmail.php

<?php

        ...................
        ...................

   public function content(){
        return new Content(
            view: 'mail.email',
        );
    }


        ...................
        ...................

Infine creiamo un percorso in \routes\web.php che ci consentirà di inviare la email

web.php

<?php


   use Illuminate\Support\Facades\Route;
   use App\Mail\SendEmailGmail;
   use Illuminate\Support\Facades\Mail;

        ...................
        ...................
   
   Route::get('/send-email', function() {
    try {
        
        Mail::to('example@domain.com')->send(new SendEmailGmail());
        return view('mail.success');
    
    }catch (\Exception $e) {
        return view('mail.error');
    }
    
});

"example@domain.com" è il destinatario della email, adesso per inviare la email basta aprire nel browser l'url /send-email della nostra applicazione Laravel, se la email verrà inviata correttamente visualizzeremo una pagina con il messaggio

 

Email Successfully Sent