Files
slim-blog/src/Shared/Mail/MailService.php
2026-03-16 01:47:07 +01:00

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;
}
}