This article is written using Laravel 5.3.

Laravel provides nice interface for creating email notifications and one can take advantage for routine tasks most applications need.

First, you have to configure your Laravel installation to send emails. This can be achieved in many ways depending on your prefered "driver". Follow the documentation to do this.

After configuring Laravel, then run the following command:

php artisan make:migration add_activation_field_to_users --table=users

This will create a migration in which we will add a new field to our users that holds the confirmation link. Change it to look like this. More about migrations.

class AddActivationFieldToUsers extends Migration  
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('activation')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('activation');
        });
    }
}

We need to set a random string for activation when a new user is created. Open User.php (the model) and add the following to you $fillable array:

    'activation',

There are multiple ways of filling this activation for every new user. I'm going to with the one that is attached to the creating event in the User model, since there are many implementations of authenticating and creating users.

public static function boot()  
{
    parent::boot();
    static::creating(function ($item) {
        $item->activation = sha1(bcrypt(time()));
    });
}

You can read more about model events at Laravel's documentation.

Now we need to send the email. Create a file App\Listeners called SendEmailConfirmation. And add a method handle() with the following body:

class SendEmailConfirmation  
{
    public function handle(Registered $event)
    {
        $event->user->notify(new EmailConfirmation($event->user->activation));
    }
}

More about event listeners at Laravel's documentation.

As you see we are missing the EmailConfirmation class, create it under the Notifications/ folder (if it doesn't exist, create the folder).

EmailConfifrmation should extend Illuminate\Notifications\Notification and contain:

class EmailConfirmation extends Notification  
{
    public $token;

    public function __construct($token)
    {
        $this->token = urlencode($token);
    }

    public function via($notifiable)
    {
        return ['mail'];
    }

    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->subject('Welcome to My App')
            ->greeting('Hi,')
            ->line('Please confirm your email address:')
            ->action('Confirm Email Address', action('Auth\ActivateAccountController@activate', ['token' => $this->token]));
    }
}

In toMail() you can edit the message you want to send to the user.

As you see in the EmailConfirmation notification there's an action that should lead to a route where the "confirmation" should happen.

Create a class called ActivateAccountController in your Auth/ folder in App/Http/Controllers/ (or wherever you want, just remember to apply the changes to toMail() as well.

class ActivateAccountController extends BaseController  
{
    public function activate($token)
    {
        $token = urldecode($token);
        $client = User::where('activation', $token)->first();

        if (is_null($client)) {
            //Modify to suit your application
            return redirect()->action('Auth\LoginController@showLoginForm')
                ->withFailure('Invalid Link');
        }

        $client->activation = null;
        $client->save();

        //Automatically login the $user after successful activation
        auth()->login($client);

        //Modify to suit your application
        return redirect()->to('/');
    }
}

Additionally, you can define an accessor in your User model:

public function getIsActivatedAttribute() {  
    return is_null($this->activation);
}

and use it wherever you need like $user->is_activated.

More about Accessors at Larave's documentation.