Laravel: inviare le e-mail usando l'SMTP locale

Short link

In Laravel possiamo inviare le e-mail usando l'SMTP locale.

Inseriamo i seguenti dati nel file di configurazione .env.


MAIL_DRIVER=smtp
MAIL_HOST=localhost
MAIL_PORT=25
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=noreply@sito.tld
MAIL_FROM_NAME=Sito

Aggiorniamo quindi la cache della configurazione.


php artisan config:cache

Creiamo una classe di tipo Mailable nella directory app/Mail< con i seguenti contenuti.


<?php

namespace App\Mail;

use App\User;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class WelcomeEmail extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * The user instance.
     *
     * @var User
     */
    public $user;
    public $text;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct(User $user, $text)
    {
        $this->user = $user;
        $this->text = $text;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->subject('Benvenuto/a sul nostro sito' )->view('emails.welcome');
    }
}

La classe accetta due parametri nel costruttore: un'istanza del modello User e una variabile opzionale che possiamo usare come testo del messaggio. Quando viene invocato il metodo build(), questi dati vengono passati alla view Blade che si trova nella directory /resources/views/emails. Si tenga presente che se non viene invocato il metodo subject(), Laravel userĂ  il nome della classe come oggetto dell'e-mail.

Definiamo quindi la view Blade in questo modo:


<!DOCTYPE html>
<html lang="it">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Benvenuto/a sul nostro sito</title></title>
</head>
<body>
    <h1>Ciao, {{ $user->name }}</h1>
    <p>{{ $text }}</p>
</body>
</html>

A questo punto si passa a creare il metodo del controller che gestirĂ  la richiesta.


<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;
use App\Mail\WelcomeEmail;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Hash;


class RegisterController extends Controller
{
    public function signup(Request $request)
    {
        // Validazione

        $user = new User();
        $user->name = $request->input('name');
        $user->email = $request->input('email');
        $user->password = Hash::make( $request->input('password') );

        $user->save();

        Mail::to($user)->send(new WelcomeEmail($user, 'Lorem ipsum dolor sit.'));

        return redirect()->route('login');

    }
}

L'autore

Gabriele Romanato, sviluppatore web full stack specializzato in siti, applicativi web ed e-commerce con Node.js e PHP.