From b4565b3ed915388d29cfa950ea0c3d923bc76526 Mon Sep 17 00:00:00 2001 From: Francesco Picone Date: Sat, 6 Dec 2025 18:05:53 +0100 Subject: [PATCH] fix mail --- README.md | 51 ++++++++++++++---- includes/config.php | 16 +++--- includes/functions.php | 114 +++++++++++++++++++++++++++++++++++++++-- 3 files changed, 158 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index ae9d160..476415b 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,27 @@ define('ADMIN_EMAIL', 'tua-email@esempio.com'); // Tua email define('SECRET_KEY', 'CAMBIA-QUESTA-CHIAVE-CON-STRINGA-CASUALE-LUNGA-E-SICURA'); ``` +#### Email SMTP con Gmail ⭐ **IMPORTANTE** +Per inviare email (recupero password), configura Gmail SMTP: + +1. **Abilita verifica 2 fattori** sul tuo account Gmail +2. Vai su [Password per le app](https://myaccount.google.com/apppasswords) +3. Seleziona "App: Posta" e "Dispositivo: Altro (nome personalizzato)" +4. Inserisci "Pilates Platform" e clicca **Genera** +5. Copia la password di 16 caratteri generata + +In `includes/config.php`: +```php +define('USE_SMTP', true); // Attiva SMTP +define('SMTP_HOST', 'smtp.gmail.com'); +define('SMTP_PORT', 587); +define('SMTP_USERNAME', 'tua-email@gmail.com'); // La tua Gmail +define('SMTP_PASSWORD', 'abcd efgh ijkl mnop'); // Password app (16 caratteri) +define('SMTP_ENCRYPTION', 'tls'); +``` + +⚠️ **Non usare la password normale di Gmail**, usa solo la password applicazione! + #### PayPal Sandbox (per Test) 1. Vai su [PayPal Developer](https://developer.paypal.com/) 2. Accedi con il tuo account PayPal @@ -263,14 +284,17 @@ Apri `assets/css/style.css` e modifica le variabili CSS: - Dimensioni: 1920x600px - Immagine di sfondo homepage -### Email -Per usare SMTP invece di `mail()` PHP, decomenta in `includes/config.php`: +### Email con Gmail SMTP +La piattaforma usa Gmail SMTP per inviare email in modo affidabile: + +1. **Configurato di default** in `includes/config.php` +2. Inserisci le tue credenziali Gmail +3. Usa **Password per le app** (non la password Gmail normale) +4. Testa inviando una richiesta di reset password + +**Per disattivare SMTP** e usare `mail()` PHP: ```php -define('SMTP_HOST', 'smtp.gmail.com'); -define('SMTP_PORT', 587); -define('SMTP_USERNAME', 'tua-email@gmail.com'); -define('SMTP_PASSWORD', 'tua-app-password'); -define('SMTP_ENCRYPTION', 'tls'); +define('USE_SMTP', false); // In config.php ``` --- @@ -378,9 +402,12 @@ Crea `.htaccess` nella cartella `includes/`: - MySQL non accetta trattini nei nomi database, usa underscore ### Le email non vengono inviate -- Configura SMTP in `config.php` -- Verifica che `mail()` PHP funzioni sul tuo server -- Controlla la cartella spam +- Verifica credenziali Gmail in `config.php` (SMTP_USERNAME e SMTP_PASSWORD) +- Usa **Password per le app** Gmail (non la password normale) +- Verifica che `USE_SMTP` sia `true` +- Controlla la cartella spam del destinatario +- Verifica log errori PHP per messaggi "SMTP Error" +- Assicurati che il server permetta connessioni SMTP in uscita (porta 587) ### I video non si vedono - Verifica che l'URL sia corretto @@ -539,7 +566,9 @@ Questo progetto è stato creato come piattaforma custom. Sei libero di modificar Dopo l'installazione: - [ ] Cambia password admin (profilo o reset_admin_password.sql) -- [ ] Configura SMTP per invio email +- [ ] **Configura Gmail SMTP** (obbligatorio per recupero password) +- [ ] Genera password applicazione Gmail +- [ ] Inserisci credenziali SMTP in config.php - [ ] Testa recupero password - [ ] Configura PayPal Sandbox - [ ] Carica almeno 3 lezioni demo diff --git a/includes/config.php b/includes/config.php index 96cc5c7..972b2f6 100644 --- a/includes/config.php +++ b/includes/config.php @@ -62,18 +62,20 @@ define('PAYPAL_API_URL', PAYPAL_SANDBOX ? // CONFIGURAZIONE EMAIL // ============================================ -// Configurazione per l'invio di email (usa SMTP per produzione) +// Configurazione per l'invio di email define('MAIL_FROM', 'noreply@pilatesstudio.com'); define('MAIL_FROM_NAME', 'Pilates Studio'); -// Impostazioni SMTP (opzionali - commentate se usi mail() PHP di base) -/* +// Usa SMTP per invio email affidabile +define('USE_SMTP', true); // Imposta false per usare mail() PHP di base + +// Impostazioni SMTP - Gmail +// Per Gmail: usa password applicazione da https://myaccount.google.com/apppasswords define('SMTP_HOST', 'smtp.gmail.com'); define('SMTP_PORT', 587); -define('SMTP_USERNAME', 'tua-email@gmail.com'); -define('SMTP_PASSWORD', 'tua-password-applicazione'); -define('SMTP_ENCRYPTION', 'tls'); -*/ +define('SMTP_USERNAME', 'tua-email@gmail.com'); // Inserisci la tua email Gmail +define('SMTP_PASSWORD', 'tua-password-applicazione'); // Password applicazione (16 caratteri) +define('SMTP_ENCRYPTION', 'tls'); // tls o ssl // ============================================ // CONFIGURAZIONE UPLOAD FILE diff --git a/includes/functions.php b/includes/functions.php index 4a7035d..7cabfbf 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -412,11 +412,115 @@ function mark_token_as_used($token) { * @return bool True se inviata, false altrimenti */ function send_email($to, $subject, $message) { - $headers = "MIME-Version: 1.0" . "\r\n"; - $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n"; - $headers .= "From: " . MAIL_FROM_NAME . " <" . MAIL_FROM . ">" . "\r\n"; - - return mail($to, $subject, $message, $headers); + if (USE_SMTP) { + return send_smtp_email($to, $subject, $message); + } else { + // Fallback a mail() PHP nativo + $headers = "MIME-Version: 1.0" . "\r\n"; + $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n"; + $headers .= "From: " . MAIL_FROM_NAME . " <" . MAIL_FROM . ">" . "\r\n"; + + return mail($to, $subject, $message, $headers); + } +} + +/** + * Invia email tramite SMTP (Gmail) + * + * @param string $to Email destinatario + * @param string $subject Oggetto email + * @param string $message Corpo email (HTML) + * @return bool True se inviata, false altrimenti + */ +function send_smtp_email($to, $subject, $message) { + try { + // Connessione al server SMTP + $smtp = fsockopen(SMTP_HOST, SMTP_PORT, $errno, $errstr, 30); + + if (!$smtp) { + error_log("SMTP Error: Impossibile connettersi a " . SMTP_HOST . ":" . SMTP_PORT); + return false; + } + + // Funzione helper per leggere risposta + $read = function() use ($smtp) { + return fgets($smtp, 515); + }; + + // Funzione helper per inviare comando + $send = function($cmd) use ($smtp) { + fputs($smtp, $cmd . "\r\n"); + }; + + // Leggi il banner di benvenuto + $read(); + + // Inizia handshake SMTP + $send("EHLO " . SMTP_HOST); + $read(); + + // Inizia TLS se richiesto + if (SMTP_ENCRYPTION === 'tls') { + $send("STARTTLS"); + $read(); + stream_socket_enable_crypto($smtp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT); + + $send("EHLO " . SMTP_HOST); + $read(); + } + + // Autenticazione + $send("AUTH LOGIN"); + $read(); + + $send(base64_encode(SMTP_USERNAME)); + $read(); + + $send(base64_encode(SMTP_PASSWORD)); + $response = $read(); + + // Verifica autenticazione + if (strpos($response, '235') === false) { + error_log("SMTP Error: Autenticazione fallita - " . $response); + fclose($smtp); + return false; + } + + // Imposta mittente + $send("MAIL FROM: <" . MAIL_FROM . ">"); + $read(); + + // Imposta destinatario + $send("RCPT TO: <" . $to . ">"); + $read(); + + // Inizia corpo messaggio + $send("DATA"); + $read(); + + // Costruisci headers + $headers = "From: " . MAIL_FROM_NAME . " <" . MAIL_FROM . ">\r\n"; + $headers .= "To: <" . $to . ">\r\n"; + $headers .= "Subject: " . $subject . "\r\n"; + $headers .= "MIME-Version: 1.0\r\n"; + $headers .= "Content-Type: text/html; charset=UTF-8\r\n"; + $headers .= "Date: " . date('r') . "\r\n"; + + // Invia email + $send($headers . "\r\n" . $message . "\r\n."); + $read(); + + // Chiudi connessione + $send("QUIT"); + $read(); + fclose($smtp); + + return true; + + } catch (Exception $e) { + error_log("SMTP Error: " . $e->getMessage()); + return false; + } } /**