PHP Mail
Scopri la funzione mail() di PHP per inviare email da uno script, con esempi pratici e note sulla sicurezza.
La funzione integrata mail() di PHP invia email direttamente da uno script, senza bisogno di librerie aggiuntive. È il modo più rapido per inviare una notifica, un messaggio di contatto o un link per il reset della password. Questo capitolo illustra la firma della funzione, fornisce esempi con testo semplice e HTML, e tratta le insidie relative alla sicurezza e alla recapitabilità che si incontrano in produzione.
Cosa fa la funzione mail()
mail() affida un messaggio all'agente di trasferimento della posta (MTA) locale del server — il programma (come Sendmail, Postfix o Exim) che si occupa effettivamente di inviare la posta al mondo esterno. PHP non comunica direttamente con server SMTP remoti; si limita a mettere in coda il messaggio localmente. Se il server non dispone di un MTA funzionante, mail() restituisce false e nulla viene inviato.
La funzione restituisce un valore boolean: true se il messaggio è stato accettato per la consegna (non è la stessa cosa di consegnato), e false in caso di errore.
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. Separare più indirizzi con una virgola. |
$subject | Sì | Oggetto del messaggio. Non deve contenere caratteri di nuova riga. |
$message | Sì | Il corpo dell'email. Le righe devono essere separate da \r\n e non superare i 70 caratteri. |
$additional_headers | No | Intestazioni aggiuntive come From, Reply-To o Content-Type. Da PHP 7.2 può essere un array associativo. |
$additional_params | No | Flag aggiuntivi della riga di comando passati all'MTA (ad esempio, il mittente envelope tramite -f). |
Invio di un'email in testo semplice
Questo è il caso più comune: un semplice messaggio di testo con alcune intestazioni.
<?php
$to = '[email protected]';
$subject = 'Test email';
$message = 'This is a test email from PHP.';
// Additional headers
$headers = 'From: [email protected]' . "\r\n";
$headers .= 'Reply-To: [email protected]' . "\r\n";
$headers .= 'X-Mailer: PHP/' . phpversion();
if (mail($to, $subject, $message, $headers)) {
echo 'Email sent successfully.';
} else {
echo 'Failed to send email.';
}
?>Impostiamo il destinatario, l'oggetto e il corpo, quindi costruiamo una stringa di intestazioni. L'intestazione From identifica il mittente, Reply-To controlla dove vanno le risposte, e X-Mailer è informativa. Le intestazioni sono unite con \r\n (ritorno a capo + avanzamento riga), che è il terminatore di riga richiesto dal protocollo email.
Invio di un'email HTML
Per inviare HTML formattato, aggiungere Content-type: text/html alle intestazioni. Senza di essa, il destinatario vedrà i tag grezzi invece del markup renderizzato.
<?php
$to = '[email protected]';
$subject = 'HTML email';
$message = '
<html>
<body>
<h1>Hello!</h1>
<p>This message is <strong>formatted with HTML</strong>.</p>
</body>
</html>';
// To send HTML mail, the Content-type header must be set
$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);
?>Invio a più destinatari
Passare un elenco separato da virgole in $to, oppure usare le intestazioni Cc/Bcc:
<?php
$to = '[email protected], [email protected]';
$subject = 'Team update';
$message = 'Meeting moved to 3 PM.';
$headers = 'From: [email protected]' . "\r\n";
$headers .= 'Bcc: [email protected]' . "\r\n";
mail($to, $subject, $message, $headers);
?>Protezione contro l'iniezione di intestazioni
Se una parte di un'intestazione — in particolare From o Reply-To — proviene dall'input dell'utente (come un modulo di contatto), un attaccante può iniettare nuove righe per aggiungere proprie intestazioni e trasformare lo script in un relay di spam. Non inserire mai input utente grezzo nelle intestazioni. Validare e sanificare prima:
<?php
// $_POST['email'] comes from an untrusted form
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
if ($email === false) {
exit('Invalid email address.');
}
// Strip any line breaks that could be used to inject headers
$email = str_replace(["\r", "\n"], '', $email);
$headers = 'From: ' . $email . "\r\n";
mail('[email protected]', 'Contact form', 'New message', $headers);
?>Vedere filter_var() e il capitolo PHP Filter per ulteriori informazioni sulla validazione dell'input, e PHP Form Validation per la gestione sicura dei dati dei moduli.
Note sulla recapitabilità e sulla produzione
Nota: La funzione
mail()si affida all'MTA locale del server. In molti ambienti di hosting moderni fallisce silenziosamente o finisce nello spam senza una configurazione adeguata. Per applicazioni reali, preferire una libreria consolidata come PHPMailer o Symfony Mailer, che supportano autenticazione SMTP, allegati, codifica e accodamento. Qualunque soluzione si scelga, configurare record SPF, DKIM e DMARC validi per il proprio dominio, affinché i provider di posta si fidino dei messaggi inviati.
Un true restituito significa solo che l'MTA ha accettato il messaggio — non è una conferma di consegna. Per tracciare la consegna effettiva, i rimbalzi e le aperture, usare un servizio di posta transazionale.
Casi d'uso comuni
- Moduli di contatto — raccogliere un messaggio e inviarlo via email al proprietario del sito (combinare con PHP Form Handling).
- Notifiche — conferme d'ordine, avvisi, reset della password.
- Report — script pianificati che inviano un riepilogo via email.
Conclusione
La funzione mail() di PHP offre un modo rapido e senza dipendenze per inviare email da uno script: fornire il destinatario, l'oggetto e il corpo, poi aggiungere intestazioni per il mittente, l'indirizzo di risposta o il contenuto HTML. Tenere presenti i suoi limiti — dipende da un MTA configurato, restituisce l'accettazione e non la consegna, e non deve mai ricevere input utente non sanificato nelle intestazioni. Per qualsiasi cosa al di là della posta semplice e a basso volume, utilizzare una libreria dedicata. Per continuare ad apprendere, esplorare PHP Functions e PHP Strings.