'Automatica (STARTTLS se il server la offre, di solito porta 587)', self::CIFRATURA_SSL => 'SSL/TLS dall\'inizio (di solito porta 465)', self::CIFRATURA_NESSUNA => 'Nessuna (solo per server interni)', ]; /** C'è un server di posta configurato dall'applicazione. */ public function configurataNellApp(): bool { return trim((string) Setting::instance()->mail_host) !== ''; } /** * Le email partono davvero: server dall'app, oppure un mailer del .env che * non sia "log" o "array" (che le scrivono nel log o le buttano). */ public function funzionante(): bool { if ($this->configurataNellApp()) { return true; } $mailer = (string) config('mail.default'); return ! in_array($mailer, ['log', 'array'], true) && ($mailer !== 'smtp' || trim((string) config('mail.mailers.smtp.host')) !== ''); } /** Porta la configurazione dell'app nel sistema di posta di Laravel. */ public function applica(?MailManager $manager = null): void { try { $impostazioni = Setting::instance(); } catch (\Throwable) { // Database non ancora pronto (prima installazione, migrazioni in // corso): resta il .env. return; } if (trim((string) $impostazioni->mail_host) === '') { return; } try { $password = $impostazioni->mail_password; } catch (DecryptException) { // Cifrata con un'altra APP_KEY: meglio tentare senza password (e // ricevere dal server un errore che dice "autenticazione") che // far cadere ogni pagina che tocca la posta. $password = null; } $cifratura = $impostazioni->mail_cifratura ?: self::CIFRATURA_AUTOMATICA; config([ 'mail.default' => 'smtp', 'mail.mailers.smtp' => [ 'transport' => 'smtp', 'scheme' => $cifratura === self::CIFRATURA_SSL ? 'smtps' : 'smtp', 'host' => $impostazioni->mail_host, 'port' => $impostazioni->mail_port ?: ($cifratura === self::CIFRATURA_SSL ? 465 : 587), 'username' => $impostazioni->mail_username ?: null, 'password' => $password ?: null, 'timeout' => 20, 'local_domain' => config('mail.mailers.smtp.local_domain'), // Senza, Symfony prova STARTTLS da solo appena il server lo offre. 'auto_tls' => $cifratura !== self::CIFRATURA_NESSUNA, ], 'mail.from.address' => $impostazioni->mail_from_address ?: config('mail.from.address'), 'mail.from.name' => $impostazioni->mail_from_name ?: ($impostazioni->congregazione_nome ?: config('mail.from.name')), ]); // Un mailer già creato tiene la configurazione con cui è nato. ($manager ?? app('mail.manager'))->purge('smtp'); } /** * Invia l'email di prova. Lancia RuntimeException con un messaggio * leggibile se il server rifiuta o non risponde. */ public function inviaProva(string $destinatario): void { $this->applica(); try { Mail::raw( "Questa è un'email di prova di TerManager2.\n\nSe la stai leggendo, il server di posta è configurato correttamente: " . 'gli utenti riceveranno le email per confermare il loro indirizzo.', fn ($messaggio) => $messaggio->to($destinatario)->subject('TerManager2 — email di prova'), ); } catch (\Throwable $e) { throw new RuntimeException('Il server di posta ha rifiutato l\'invio: ' . $e->getMessage(), 0, $e); } } }