W3docs

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
ParametroObbligatorioDescrizione
$toIndirizzo/i del destinatario. Separare più indirizzi con una virgola.
$subjectOggetto del messaggio. Non deve contenere caratteri di nuova riga.
$messageIl corpo dell'email. Le righe devono essere separate da \r\n e non superare i 70 caratteri.
$additional_headersNoIntestazioni aggiuntive come From, Reply-To o Content-Type. Da PHP 7.2 può essere un array associativo.
$additional_paramsNoFlag 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.

Esercizio

Pratica
Quali sono i parametri della funzione mail() di PHP?
Quali sono i parametri della funzione mail() di PHP?
Was this page helpful?