This commit is contained in:
Francesco Picone
2025-12-06 18:05:53 +01:00
parent 0be59cc836
commit b4565b3ed9
3 changed files with 158 additions and 23 deletions

View File

@@ -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;
}
}
/**