(PHP 4, PHP 5, PHP 7, PHP 8)
mail — Invio mail
$to
,$subject
,$message
,$additional_headers
= ?,$additional_parameters
= ?Invia una email.
to
Destinatario, o destinatari della mail.
La formattazione della stringa deve rispettare l' » RFC 2822. Alcuni esempi sono:
subject
L'oggetto dell'email da inviare.
L'oggetto deve soddisfare l'» RFC 2047.
message
Il messaggio da inviare.
Ogni riga dovrebbe essere separata con un CRLF (\r\n). Le righe non dovrebbero essere più lunghe di 70 caratteri.
(Solo per Windows) Quando PHP comunica direttamente con un server SMTP, se viene trovato un punto all'inizio di una riga, esso viene rimosso. Per contrastare questo, sostituire queste occorrenze con un doppio punto.
<?php
$text = str_replace("\n.", "\n..", $text);
?>
additional_headers
(opzionale)String o array da inserire alla fine dell'header dell'email.
Questa è tipicamente usata per aggiungere degli header extra (Da, Cc, e Bcc). Gli header extra multipli dovrebbero essere separati con un CRLF (\r\n). Se vengono utilizzati dati esterni per comporre questo header, i dati dovrebbero essere sanitizzati in modo che nessun header non voluto possa essere iniettato.
Se viene passato un array, le sue chiavi sono i nomi degli header ed i suoi valori sono i rispettivi valori degli header.
Nota:
Prima di PHP 5.4.42 e 5.5.27, rispettivamente,
additional_headers
non aveva una protezione per l'injection dell'header della mail. Quindi, gli utenti devono assicurarsi che gli header specifici siano sicuri e che contengano solo header. p.e. Mai iniziare il corpo della mail mettendo righe vuote multiple.
Nota:
Quando si invia una mail, la mail deve contenere un header
From
. Questo può essere settato con il parametroadditional_headers
, o può essere settato un valore di default in php.ini.Non riuscendo a fare questo si avrà un messaggio di errore simile a
Warning: mail(): "sendmail_from" not set in php.ini or custom "From:" header missing
. L'headerFrom
setta ancheReturn-Path
sotto Windows.
Nota:
Se i messaggi non vengono ricevuti, provare ad utilizzare solo un LF (\n). Alcuni agent di trasferimento mail Unix (soprattutto » qmail) sostituiscono LF con CRLF automaticamente (che porta a raddoppiare CR se viene utilizzato CRLF). Questa dovrebbe essere un'ultima spiaggia, in quanto non è conforme con l' » RFC 2822.
additional_parameters
(opzionale)
Il parametro additional_parameters
può essere usato per passare flag aggiuntive come opzioni della linea di comando al
programma configurato per essere usato quando si inviano mail, come definito dall'
impostazione di configurazione sendmail_path
. Per esempio,
questo può essere utilizzato per impostare l'indirizzo del mittente della mail quando si usa
sendmail con l'opzione -f
di sendmail.
Su questo parametro è effettuato internamente l'escape da escapeshellcmd() per impedire l'esecuzione di comandi. escapeshellcmd() impedisce l'esecuzione del comando, ma permette di aggiungere parametri aggiuntivi. Per motivi di sicurezza, è raccomandato che l'utente sanitizzi questo parametro per evitare di aggiungere parametri non voluti sulla shell di comando.
Dato che escapeshellcmd() viene applicato automaticamente, alcuni caratteri che sono permessi come indirizzo email dall'internet di RFC non possono essere utilizzati. mail() non può permettere tali caratteri, così in programmi dove l'uso di tali caratteri è richiesto, sono raccomandati mezzi alternativi di invio delle email (come l'utilizzo di un framework o di una libreria).
L'utente con il quale il webserver viene eseguito dovrebbe essere aggiunto come utente fidato alla configurazione sendmail per prevenire l'aggiunta di un header 'X-Warning' al messaggio quando il mittente del messaggio (-f) viene impostato usando questo metodo. Per gli utenti sendmail, questo file è /etc/mail/trusted-users.
Restituisce true
se la mail è stata acccettata con successo per la consegna, false
in caso contrario.
È importante notare che solo perchè la mail è stata accettata per la consegna, questo NON significa che la mail raggiungerà effettivamente la destinazione prevista.
Versione | Descrizione |
---|---|
7.2.0 |
Il parametro additional_headers ora accetta anche
un array.
|
Example #1 Invio di mail.
Utilizzo di mail() per inviare una semplice email:
<?php
// Il messaggio
$message = "Line 1\r\nLine 2\r\nLine 3";
// Nel caso in cui qualsiasi delle linee sarà più lunga di 70 caratteri, si dovrà utilizzare wordwrap()
$message = wordwrap($message, 70, "\r\n");
// Invio
mail('caffeinated@example.com', 'My Subject', $message);
?>
Example #2 Inviare mail con header extra.
L'aggiunta di header di base, indicando gli indirizzi MUA From e Reply-To:
<?php
$to = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@example.com' . "\r\n" .
'Reply-To: webmaster@example.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
?>
Example #3 Inviare mail con header extra come array
Questo esempio invia la stessa mail come l'esempio immediatamente sopra, ma passa gli header aggiuntivi come array (disponibile da PHP 7.2.0).
<?php
$to = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = array(
'From' => 'webmaster@example.com',
'Reply-To' => 'webmaster@example.com',
'X-Mailer' => 'PHP/' . phpversion()
);
mail($to, $subject, $message, $headers);
?>
Example #4 Invio mail con un parametro di linea di comando aggiuntivo.
Il parametro additional_parameters
può essere usato per passare un parametro aggiuntivo al programma configurato
da usare quando si inviano mail utilizzando il sendmail_path
.
<?php
mail('nobody@example.com', 'the subject', 'the message', null,
'-fwebmaster@example.com');
?>
Example #5 Invio di email HTML
È anche possibile inviare email HTML con mail().
<?php
// Destinatari multipli
$to = 'johny@example.com, sally@example.com'; // notare la virgola
// Oggetto
$subject = 'Promemoria compleanni di Agosto';
// Messaggio
$message = '
<html>
<head>
<title>Promemoria compleanni di Agosto</title>
</head>
<body>
<p>Questi sono i compleanni di Agosto!</p>
<table>
<tr>
<th>Persona</th><th>Giorno</th><th>Mese</th><th>Anno</th>
</tr>
<tr>
<td>Johny</td><td>10</td><td>Agosto</td><td>1970</td>
</tr>
<tr>
<td>Sally</td><td>17</td><td>Agosto</td><td>1973</td>
</tr>
</table>
</body>
</html>
';
// Per inviare mail HTML, deve essere impostato l'header Content-type
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/html; charset=iso-8859-1';
// Header aggiuntivi
$headers[] = 'To: Mary <mary@example.com>, Kelly <kelly@example.com>';
$headers[] = 'From: Birthday Reminder <birthday@example.com>';
$headers[] = 'Cc: birthdayarchive@example.com';
$headers[] = 'Bcc: birthdaycheck@example.com';
// Invia la mail
mail($to, $subject, $message, implode("\r\n", $headers));
?>
Nota:
Se si intende inviare mail HTML o mail complesse, è raccomandato usare il package PEAR » PEAR::Mail_Mime.
Nota:
L'implementazione di Windows di mail() differisce in molti modi dall'implementazione di Unix. Innanzitutto, essa non usa un binario locale per comporre i messaggi ma opera solo sui socket diretti che significa che è necessario un
MTA
in ascolto su un socket della rete (che può essere sia sul localhost che su una macchina remota).In secondo luogo, gli header personalizzati come
From:
,Cc:
,Bcc:
eDate:
non sono interpretati dall'MTA
in primo luogo, ma sono analizzati da PHP.Pertanto, il parametro
to
non dovrebbe essere un indirizzo nella forma di "Qualcosa <someone@example.com>". Il comando mail non può analizzarlo correttamente mentre comunica con l'MTA.
Nota:
Vale la pena notare che la funzione mail() non è adatta per grandi volumi di email in un ciclo. Questa funzione apre e chiude un socket SMTP per ogni email, che non è molto efficiente.
Per l'invio di grandi quantità di email, vedere i package » PEAR::Mail, e » PEAR::Mail_Queue.
Nota:
I seguenti RFC possono essere utili: » RFC 1896, » RFC 2045, » RFC 2046, » RFC 2047, » RFC 2048, » RFC 2049, e » RFC 2822.