Posta configurabile dall'app, contatti dei proclamatori, conferma email

- Server di posta in Impostazioni (password cifrata, email di prova): se
  compilato prende il posto del .env; non si esporta e l'import XML non lo
  cancella. MAIL_SCHEME=tls nel .env.example non era valido per Laravel 11.
- Proclamatori con email e telefono facoltativi, cifrati, nell'XML e
  cancellati dall'anonimizzazione; il numero apre WhatsApp.
- Dopo l'assegnazione un riquadro in evidenza con il link del PDF,
  "Invia su WhatsApp" con il messaggio pronto e la scelta "inviato /
  non ancora", che resta finché non si sceglie.
- Conferma dell'email obbligatoria per tutti gli utenti, anche esistenti:
  email in italiano, link valido senza login, nuova conferma a ogni cambio
  di indirizzo, "Reinvia conferma" in Utenti. Senza conferma restano
  raggiungibili profilo, cambio password e, per l'admin, il server di
  posta; comando utenti:conferma-email per l'emergenza.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-12 17:12:31 +02:00
parent e7148c7b32
commit fc8623f7db
35 changed files with 1737 additions and 14 deletions

View File

@@ -3,6 +3,10 @@
namespace App\Providers;
use App\Models\Setting;
use App\Services\ConfigurazionePosta;
use Illuminate\Auth\Middleware\EnsureEmailIsVerified;
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Queue;
@@ -24,7 +28,42 @@ class AppServiceProvider extends ServiceProvider
// un'ora: senza questo, ogni job usava le impostazioni lette dal primo,
// anche dopo che l'amministratore le aveva cambiate dal browser o un
// ripristino le aveva sostituite.
Queue::before(fn () => Setting::flushCache());
Queue::before(function () {
Setting::flushCache();
// Anche il server di posta: cambiato dal browser, il worker
// continuava a usare quello del primo invio.
if ($this->app->resolved('mail.manager')) {
app(ConfigurazionePosta::class)->applica();
}
});
// L'email di conferma in italiano. Il link resta quello di Laravel
// (firmato, scade dopo auth.verification.expire minuti) e porta a
// VerificaEmailController::conferma, che funziona anche senza login.
VerifyEmail::toMailUsing(function ($utente, string $link) {
$minuti = (int) config('auth.verification.expire', 60);
return (new MailMessage)
->subject('Conferma il tuo indirizzo email — TerManager2')
->greeting('Ciao ' . $utente->name . ',')
->line('per usare TerManager2 conferma che questo indirizzo email è tuo.')
->action('Conferma l\'indirizzo', $link)
->line("Il link vale {$minuti} minuti. Se è scaduto, entra in TerManager2 e chiedine uno nuovo.")
->line('Se non sai di cosa si tratta, ignora questa email.')
->salutation('TerManager2');
});
// Le richieste di Livewire non ripassano dal gruppo di rotte della
// pagina: senza, una scheda aperta prima del blocco continuerebbe a
// lavorare con un'email non confermata.
Livewire::addPersistentMiddleware([EnsureEmailIsVerified::class]);
// Il server di posta configurato in Impostazioni prende il posto di
// quello del .env, appena Laravel crea il sistema di posta.
$this->app->afterResolving('mail.manager', function ($manager) {
app(ConfigurazionePosta::class)->applica($manager);
});
// Pin generated URLs to APP_URL.
//