add SMTP sender

This commit is contained in:
2026-05-27 07:29:29 +02:00
parent 982d754857
commit b0865368c8
19 changed files with 1384 additions and 35 deletions
+66
View File
@@ -608,6 +608,72 @@ php artisan route:list --name=email
(Last updated: 26 Maggio 2026 - Fix Salvataggio is_admin)
### 26 Maggio 2026 - Sender Accounts (Mittenti Aggiuntivi solo invio)
- **Nuova tabella**: `sender_accounts` con migration `2026_05_26_000002`
- **Colonne**: `id`, `email_address` (UNIQUE), `email_name`, `smtp_host`, `smtp_port`, `smtp_encryption`, `smtp_username`, `smtp_password` (Crypt), `reply_to`, `verify_email`, `note`, `is_active`, timestamps
- **Model `SenderAccount`**: `$fillable`, `$casts`, metodi:
- `getDecryptedPassword()` — decripta password SMTP con fallback
- `sanitizeName()` — pulisce il nome visualizzato
- `getReplyTo()` — priorità: `reply_to` → `verify_email` → null
- `buildDsn()` — costruisce DSN Symfony Mailer
- `buildSymfonyEmail(to, subject, body)` — costruisce email con From, Reply-To
- `sendEmail(to, subject, body, attachmentPaths)` — invia via Symfony Mailer
- `sendReport(subject, body)` — invia report riepilogo a `verify_email`
- **Logica Reply-To**: se impostato `reply_to` (es. `no-reply@parrocchia.it`) → quello; fallback `verify_email`; nessun Reply-To se entrambi null
- **Report invio**: dopo ogni invio massivo via sender, una email di riepilogo viene inviata a `verify_email` con: mittente, oggetto, totale, ok, falliti, dettaglio errori
- **Migration `2026_05_26_000003`**: aggiunte colonne `log_falliti` (JSON), `mittente_nome`, `mittente_email` a `mailing_messaggi`
- **Model `MailingMessaggio`**: aggiornato `$fillable` e `$casts` per `log_falliti` (array)
- **CRUD in `EmailSettingsController`**: 4 nuovi metodi protetti da `authorizeWrite('settings')`:
- `senderStore()` — crea nuovo sender con password criptata
- `senderUpdate()` — modifica sender, password opzionale
- `senderDestroy()` — elimina sender
- `senderTestSmtp()` — test invio email via sender
- **Routes** (6 nuove):
- `POST /impostazioni/sender` → `senderStore`
- `PUT /impostazioni/sender/{id}` → `senderUpdate`
- `DELETE /impostazioni/sender/{id}` → `senderDestroy`
- `POST /impostazioni/sender/{id}/test` → `senderTestSmtp`
- `GET /mailing/invio` → `MailingController@invio` (prima mancante)
- `POST /mailing/invio/elabora` → `MailingController@invioElabora` (prima mancante)
- **`EmailController@compose`**: passa `$senderAccounts` alla view; nuova view mostra dropdown "Da (mittente)" prima dei destinatari
- **`EmailController@send`** modificato:
- Se `mittente_id` > 0 → usa `SenderAccount::sendEmail()` con allegati; salta store sent message
- Se `mittente_id` = 0 o assente → comportamento attuale con `EmailSetting`
- Processa allegati `allegati[]` e `documenti_selezionati`
- Nuovo helper: `sendWithSender()`, `processAttachments()`, `resolveAttachmentPaths()`
- `sendViaImap()` ora accetta `$attachmentPaths` e li attacha all'email
- **`MailingController`** riscritto con invio SMTP reale:
- `invia()` — invio 1:1 a ogni destinatario, log su `mailing_messaggi`
- `invioElabora()` — invio massivo 1:1 per ogni email da liste multiple, log su `mailing_messaggi`
- Tracking: stato `in_coda` → `inviato`/`parziale`/`fallito`, conteggi ok/fail, log_falliti JSON
- Summary email a `verify_email` dopo invio massivo
- `sendViaSystem()` — invio via EmailSetting (fallback quando nessun sender selezionato)
- `resolveMailingAttachmentPaths()` — risolve path file da Documenti selezionati
- **View `email-settings/index.blade.php`**:
- Nuovo tab "Mittenti Aggiuntivi" nella sidebar
- Tabella con email, nome, SMTP, Reply-To, Verify, Stato, Azioni (Modifica/Test/Elimina)
- Modal CRUD per creare/modificare sender con tutti i campi
- JS: `resetSenderForm()`, `editSender(id)`, `testSenderSmtp(id)`
- Sezione informativa "Come funziona"
- **View `email/compose.blade.php`**: dropdown "Da (mittente)" se ci sono sender attivi (default: Sistema)
- **View `mailing/nuovo.blade.php`**: dropdown "Mittente" se ci sono sender attivi
- **View `mailing/invio.blade.php`**: dropdown "Mittente" se ci sono sender attivi
- **Files creati**:
- `database/migrations/2026_05_26_000002_create_sender_accounts_table.php`
- `database/migrations/2026_05_26_000003_add_log_falliti_to_mailing_messaggi.php`
- `app/Models/SenderAccount.php`
- **Files modificati**:
- `app/Models/MailingMessaggio.php`
- `app/Http/Controllers/Admin/EmailSettingsController.php`
- `app/Http/Controllers/EmailController.php`
- `app/Http/Controllers/MailingController.php`
- `routes/web.php`
- `resources/views/admin/email-settings/index.blade.php`
- `resources/views/email/compose.blade.php`
- `resources/views/mailing/nuovo.blade.php`
- `resources/views/mailing/invio.blade.php`
### 26 Maggio 2026 - Export ICS/iCal Eventi
- **Nuovo Service**: `app/Services/IcsExportService.php` — generazione file ICS RFC 5545
- `generateSingle(Evento)` — esporta un singolo evento