mail()
Scopri la funzione mail() in PHP, usata per inviare messaggi email direttamente da uno script PHP.
La funzione mail() invia messaggi email direttamente da uno script PHP. È il modo più semplice e nativo per inviare posta, e questa guida ne copre la sintassi e i parametri, il funzionamento degli header, l'invio di email HTML e a più destinatari, le problematiche di sicurezza da evitare e quando conviene usare una libreria dedicata.
Cos'è la funzione mail()?
La funzione mail() è una funzione PHP integrata che consegna un'email al mail transfer agent (MTA) del sistema — tipicamente sendmail su Linux — oppure al server SMTP configurato in php.ini. Poiché dipende da tale configurazione locale, mail() restituisce spesso false (o consegna silenziosamente senza successo) su una macchina di sviluppo priva di MTA. Non apre autonomamente una connessione SMTP, quindi non può autenticarsi con un provider esterno come Gmail.
Un valore di ritorno true significa solo che il messaggio è stato accettato per la consegna dall'MTA — non è una garanzia che l'email sia arrivata nella casella del destinatario.
Sintassi
mail(
string $to,
string $subject,
string $message,
array|string $additional_headers = [],
string $additional_params = ""
): bool| Parametro | Obbligatorio | Descrizione |
|---|---|---|
$to | Sì | Indirizzo/i del destinatario. Più indirizzi sono separati da virgola, es. "[email protected], [email protected]". |
$subject | Sì | La riga dell'oggetto. Non deve contenere interruzioni di riga. |
$message | Sì | Il corpo del messaggio. Ogni riga deve essere separata da \r\n e non superare i 70 caratteri. |
$additional_headers | No | Header aggiuntivi come From, Cc, Bcc, Content-Type. Una stringa (separata da CRLF) oppure, da PHP 7.2, un array associativo. |
$additional_params | No | Flag aggiuntivi passati alla riga di comando dell'MTA (es. -f per impostare il mittente della busta). |
Come usare la funzione mail()
Ecco un esempio completo in testo semplice che costruisce gli header e verifica il valore di ritorno:
<?php
$to = '[email protected]';
$subject = 'Test email';
$message = 'This is a test email from PHP';
// Additional headers
$headers = 'From: [email protected]' . "\r\n"
. 'Reply-To: [email protected]' . "\r\n"
. 'X-Mailer: PHP/' . phpversion();
// Send the email and check the result
if (mail($to, $subject, $message, $headers)) {
echo "Email sent successfully.";
} else {
echo "Email delivery failed.";
}
?>Definiamo il destinatario, l'oggetto e il messaggio, poi costruiamo gli header. Poiché mail() restituisce un booleano, è buona pratica verificare il valore di ritorno anziché dare per scontato il successo. L'header From è importante: senza di esso, molti server di posta rifiutano il messaggio o lo segnalano come spam.
Invio di un'email HTML
Per inviare HTML invece di testo semplice, aggiungere Content-Type: text/html agli header. Senza di esso, il client mostra i tag grezzi come testo.
<?php
$to = '[email protected]';
$subject = 'HTML email test';
$message = '<h1>Hello</h1><p>This message is <b>HTML</b>.</p>';
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
$headers .= "From: [email protected]\r\n";
mail($to, $subject, $message, $headers);
?>Più destinatari, Cc e Bcc
Inserire più indirizzi in $to (separati da virgola) per la riga "To" visibile, e usare gli header Cc/Bcc per le copie:
<?php
$to = '[email protected], [email protected]';
$subject = 'Team update';
$message = 'See attached agenda.';
$headers = "From: [email protected]\r\n";
$headers .= "Cc: [email protected]\r\n";
$headers .= "Bcc: [email protected]\r\n";
mail($to, $subject, $message, $headers);
?>I destinatari in Bcc sono nascosti a tutti gli altri, mentre gli indirizzi in Cc sono visibili a tutti i destinatari.
Sicurezza: evitare l'iniezione di header
Se qualsiasi parte del destinatario, dell'oggetto o degli header proviene da input dell'utente — ad esempio un modulo di contatto — un attaccante può iniettare interruzioni di riga aggiuntive per inserire i propri header Cc/Bcc e sfruttare il server per inviare spam. Validare sempre gli indirizzi e rimuovere le interruzioni di riga prima di passarli a mail():
<?php
$email = $_POST['email'] ?? '';
// Reject anything that is not a valid email address
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
exit('Invalid email address.');
}
// Strip CR/LF so the value can't inject new headers
$email = str_replace(["\r", "\n"], '', $email);
?>Usare filter_var() con FILTER_VALIDATE_EMAIL per la validazione, e consultare PHP Form Validation e Form URL/E-mail handling per i pattern di gestione sicura dei moduli.
Limitazioni e quando usare una libreria
mail() è adatta per messaggi semplici e a basso volume, ma presenta limiti reali:
- Non può autenticarsi con un server SMTP esterno (nessun nome utente/password, nessun handshake TLS).
- Non offre supporto nativo per gli allegati — è necessario costruire manualmente le parti MIME.
- La segnalazione degli errori è minima: un ritorno
falsedice poco sul perché la consegna sia fallita.
Per ambienti di produzione, email transazionali o qualsiasi cosa con allegati, usare una libreria dedicata come PHPMailer o Symfony Mailer. Gestiscono l'autenticazione SMTP, la codifica, gli allegati e una segnalazione degli errori molto più dettagliata.
Conclusione
La funzione mail() offre un modo rapido per inviare email direttamente da PHP ed è adatta per semplici notifiche quando è disponibile un MTA funzionante. Ricordare che il suo successo dipende dalla configurazione del server, che è necessario proteggersi dall'iniezione di header con i dati forniti dagli utenti, e che i sistemi in produzione sono solitamente meglio serviti da PHPMailer o Symfony Mailer. Per ulteriori approfondimenti, esplorare PHP Functions e la funzione header().