mail

(PHP 4, PHP 5, PHP 7, PHP 8)

mailInvio mail

Descrizione

mail(
    string $to,
    string $subject,
    string $message,
    mixed $additional_headers = ?,
    string $additional_parameters = ?
): bool

Invia una email.

Elenco dei parametri

to

Destinatario, o destinatari della mail.

La formattazione della stringa deve rispettare l' » RFC 2822. Alcuni esempi sono:

  • user@example.com
  • user@example.com, anotheruser@example.com
  • Utente
  • Utente , Un Altro utente

subject

L'oggetto dell'email da inviare.

Attenzione

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.

Attenzione

(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 parametro additional_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'header From setta anche Return-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.

Valori restituiti

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.

Log delle modifiche

Versione Descrizione
7.2.0 Il parametro additional_headers ora accetta anche un array.

Esempi

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.

Note

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: e Date: 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.

Vedere anche: