Sistema di Notifiche Email per la Gestione Domini
Introduzione
Questo sistema di notifiche email è progettato per gestire varie comunicazioni automatizzate relative ai domini. Utilizza un sistema di code per l'invio asincrono delle email, migliorando l'efficienza e la robustezza del processo di notifica.
Struttura del Sistema
Il sistema è composto da quattro componenti principali:
Interfaccia (EmailNotificationServiceInterface)
Servizio di Implementazione (EmailNotificationService)
Modello della Coda Email (EmailQueue)
Comando di Elaborazione della Coda (ProcessEmailQueue)
Classe Mailable Generica (GenericEmail)
Interfaccia (EmailNotificationServiceInterface)
namespace App\Interfaces;
interface EmailNotificationServiceInterface
{
public function sendActivationNotification(string $recipient, string $domainName): self;
public function sendSuspensionNotification(string $recipient, string $domainName, string $reason): self;
public function sendExpirationReminder(string $recipient, string $domainName, int $daysLeft): self;
public function sendAutoRenewalNotification(string $recipient, string $domainName, string $renewalDate, float $price): self;
public function sendDomainTransferNotification(string $recipient, string $domainName, string $status): self;
public function sendDNSChangeNotification(string $recipient, string $domainName, array $changes): self;
public function sendSuspiciousLoginNotification(string $recipient, string $accountName, string $ipAddress, string $dateTime): self;
public function send(): void;
}
Servizio di Implementazione (EmailNotificationService)
Questa classe implementa l'interfaccia e contiene la logica per la preparazione delle notifiche e l'inserimento nella coda.
namespace App\Services;
use App\Interfaces\EmailNotificationServiceInterface;
use App\Models\EmailQueue;
class EmailNotificationService implements EmailNotificationServiceInterface
{
protected $recipient;
protected $subject;
protected $content;
// Implementazione dei metodi di notifica...
public function send(): void
{
EmailQueue::create([
'recipient' => $this->recipient,
'subject' => $this->subject,
'content' => $this->content,
'status' => 'pending'
]);
}
}
Modello della Coda Email (EmailQueue)
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class EmailQueue extends Model
{
protected $fillable = [
'recipient', 'subject', 'content', 'status', 'attempts', 'last_attempt_at', 'sent_at', 'error_message'
];
// ... altri metodi e relazioni ...
}
Comando di Elaborazione della Coda (ProcessEmailQueue)
Questo comando Artisan elabora le email in coda:
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\EmailQueue;
use Illuminate\Support\Facades\Mail;
use App\Mail\GenericEmail;
class ProcessEmailQueue extends Command
{
protected $signature = 'emails:process';
public function handle()
{
// Logica per elaborare le email in coda
}
// ... altri metodi ...
}
Classe Mailable Generica (GenericEmail)
namespace App\Mail;
use Illuminate\Mail\Mailable;
class GenericEmail extends Mailable
{
public $subject;
public $htmlContent;
public function __construct(string $subject, string $htmlContent)
{
$this->subject = $subject;
$this->htmlContent = $htmlContent;
}
public function build()
{
return $this->subject($this->subject)
->html($this->htmlContent);
}
}
Flusso di Lavoro
Preparazione della Notifica: Utilizzare EmailNotificationService per preparare il contenuto della notifica.
Accodamento: Il metodo send() del servizio inserisce l'email nella coda.
Elaborazione: Il comando ProcessEmailQueue elabora le email in coda periodicamente.
Invio: Le email vengono inviate utilizzando la classe GenericEmail.
Gestione degli Errori: Il sistema gestisce gli errori, ritenta l'invio e notifica gli amministratori in caso di problemi persistenti.
Utilizzo del Sistema
Esempio di utilizzo nel codice:
public function sendWelcomeEmail(EmailNotificationServiceInterface $notificationService, $userId)
{
$user = User::find($userId);
$notificationService->sendActivationNotification($user->email, $user->domain)->send();
}
Configurazione del Cron Job
Assicurarsi di configurare un cron job per eseguire php artisan schedule:run ogni minuto. Questo garantirà l'elaborazione regolare della coda di email.
Best Practices
Mantenere il contenuto delle notifiche conciso e chiaro.
Utilizzare template Blade per il contenuto delle email per una migliore manutenibilità.
Monitorare regolarmente il log degli errori e le email fallite.
Testare tutte le nuove notifiche in un ambiente di staging prima del rilascio in produzione.
Risoluzione dei Problemi
Controllare i log dell'applicazione per errori dettagliati.
Verificare lo stato delle email nella tabella email_queue.
Assicurarsi che il cron job sia configurato correttamente e in esecuzione.
Last modified: 12 settembre 2024