96 lines
3.3 KiB
PHP
96 lines
3.3 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Shared\Mail;
|
|
|
|
use PHPMailer\PHPMailer\Exception as MailerException;
|
|
use PHPMailer\PHPMailer\PHPMailer;
|
|
use Slim\Views\Twig;
|
|
|
|
/**
|
|
* Service d'envoi d'emails.
|
|
*
|
|
* Wrapper autour de PHPMailer configuré depuis les variables d'environnement.
|
|
* Le rendu des templates est délégué à Twig — les templates d'emails
|
|
* sont des vues autonomes dans views/emails/ (pas d'héritage de layout.twig).
|
|
*/
|
|
final class MailService implements MailServiceInterface
|
|
{
|
|
/**
|
|
* @param Twig $twig Instance Twig pour le rendu des templates d'emails
|
|
* @param string $host Serveur SMTP
|
|
* @param int $port Port SMTP (465 pour SSL, 587 pour TLS)
|
|
* @param string $username Identifiant SMTP
|
|
* @param string $password Mot de passe SMTP
|
|
* @param string $encryption Chiffrement : 'ssl' ou 'tls'
|
|
* @param string $from Adresse expéditeur
|
|
* @param string $fromName Nom expéditeur
|
|
*/
|
|
public function __construct(
|
|
private readonly Twig $twig,
|
|
private readonly string $host,
|
|
private readonly int $port,
|
|
private readonly string $username,
|
|
private readonly string $password,
|
|
private readonly string $encryption,
|
|
private readonly string $from,
|
|
private readonly string $fromName,
|
|
) {
|
|
}
|
|
|
|
/**
|
|
* Envoie un email HTML à partir d'un template Twig.
|
|
*
|
|
* Le corps texte brut est généré automatiquement depuis le HTML
|
|
* via strip_tags() pour les clients mail qui n'affichent pas le HTML.
|
|
*
|
|
* @param string $to Adresse email du destinataire
|
|
* @param string $subject Sujet de l'email
|
|
* @param string $template Chemin du template Twig (ex: 'emails/password-reset.twig')
|
|
* @param array<string, mixed> $context Variables transmises au template
|
|
*
|
|
* @throws \RuntimeException Si l'envoi échoue
|
|
* @return void
|
|
*/
|
|
public function send(string $to, string $subject, string $template, array $context = []): void
|
|
{
|
|
$html = $this->twig->getEnvironment()->render($template, $context);
|
|
$mail = $this->createMailer();
|
|
|
|
$mail->addAddress($to);
|
|
$mail->Subject = $subject;
|
|
$mail->Body = $html;
|
|
$mail->AltBody = strip_tags($html);
|
|
|
|
try {
|
|
$mail->send();
|
|
} catch (MailerException $e) {
|
|
throw new \RuntimeException("Échec de l'envoi de l'email : {$e->getMessage()}", 0, $e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Crée et configure une instance PHPMailer prête à l'envoi.
|
|
*
|
|
* @return PHPMailer L'instance configurée avec les paramètres SMTP injectés
|
|
*/
|
|
private function createMailer(): PHPMailer
|
|
{
|
|
$mail = new PHPMailer(true);
|
|
|
|
$mail->isSMTP();
|
|
$mail->Host = $this->host;
|
|
$mail->SMTPAuth = true;
|
|
$mail->Username = $this->username;
|
|
$mail->Password = $this->password;
|
|
$mail->SMTPSecure = $this->encryption === 'ssl'
|
|
? PHPMailer::ENCRYPTION_SMTPS
|
|
: PHPMailer::ENCRYPTION_STARTTLS;
|
|
$mail->Port = $this->port;
|
|
$mail->CharSet = PHPMailer::CHARSET_UTF8;
|
|
$mail->setFrom($this->from, $this->fromName);
|
|
|
|
return $mail;
|
|
}
|
|
}
|