Dans ce chapitre nous allons mettre en place le formulaire de contact qui va permettre aux utilisateurs de contacter l'agence lorsqu'ils sont intéressés par les biens. Ce chapitre sera l'occasion de découvrir le système de Mailable
qui permet d'envoyer des utilisateurs depuis Laravel.
Configuration
Si vous essayez d'envoyer des emails avec Laravel, par défaut, en mode développement, il est configuré pour écrire les emails envoyés dans le fichier de log. Cette méthode est pratique parce qu'elle vous permet de tester vos emails sans forcément avoir besoin d'un serveur SMTP mais il n'est pas forcément évident de lire ce fichier pour visualiser les emails.
Aussi je vous conseille d'utiliser des outils comme mailhog qui vont vous permettre de créer un serveur SMTP sur votre machine qui sera capable de capturer les emails qui vont être envoyés. Ces outils vous offrent ensuite une interface web, qui ressemble à un client email, dans lequel vous allez pouvoir consulter les emails qui ont été capturés.
Il vous faudra ensuite modifier le fichier d'environnement pour mettre les informations correspondant à cet outil.
MAIL_MAILER=smtp
MAIL_HOST=localhost
MAIL_PORT=1025
Vous pouvez aussi regarder le fichier de configuration config/mail.php
pour voir les différents protocoles qui sont supportés et la configuration de base.
Mailable
Pour commencer à gérer l'envoi d'email on doit créer une classe qui va représenter le mail à envoyer
php artisan make:mail PropertyContactMail
Cette commande va créer une classe qui étend de Illuminate\Mail\Mailable
qu'il faudra modifier en fonction de nos besoin. Dans notre cas nous allons modifier le constructeur pour lui passer les informations qui nous intéresse (les données du formulaire ainsi que le bien associé à la demande).
<?php
namespace App\Mail;
use App\Models\Property;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class PropertyContactMail extends Mailable
{
use Queueable, SerializesModels;
public function __construct(
public Property $property,
public array $data
)
{
}
public function envelope(): Envelope
{
return new Envelope(
to: 'admin@doe.fr',
replyTo: $this->data['email'],
subject: 'Property Contact Mail'
);
}
public function content(): Content
{
return new Content(
markdown: 'emails.property.contact',
);
}
/**
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}
La méthode envelope()
permet de définir des attributs sur notre email tandis que la méthode content()
permet de définir à quoi va ressembler le contenu de l'email. Pour cette partie contenu on peut définir l'email de différentes manières (text, html ou markdown) en utilisant le chemin vers une vue blade.
L'option markdown est intéréssante car elle permet de construire l'email plus rapidement en n'ayant pas à gérer la structure HTML complexe nécessaire pour un bon fonctionnement sur les différents clients mails.
<x-mail::message>
# Nouvelle demande de contact
Une nouvelle demande de contact a été fait pour le bien <a href="{{ route('property.show', ['slug' => $property->getSlug(), 'property' => $property]) }}">{{ $property->title }}</a>.
- Prénom : {{ $data['firstname'] }}
- Nom : {{ $data['lastname'] }}
- Téléphone : {{ $data['phone'] }}
- Email : {{ $data['email'] }}
**Message :**<br/>
{{ $data['message'] }}
</x-mail::message>
Envoi
Maintenant que l'on a notre classe qui permet de représenter un email il va falloir l instancier et l'envoyer.
use App\Http\Requests\PropertyContactRequest;
use App\Http\Requests\SearchPropertiesRequest;
use App\Mail\PropertyContactMail;
use App\Models\Property;
use Illuminate\Support\Facades\Mail;
public function contact(
Property $property,
PropertyContactRequest $request
)
{
Mail::send(new PropertyContactMail($property, $request->validated()));
return back()->with('success', 'Votre demande de contact a bien été envoyé');
}
Laravel dispose d'une façade Illuminate\Support\Facades\Mail
qui attend en paramètre une instance de Mailable
.