Invio di e-mail in PHP
Da Hacknowledge.
Il PHP, se configurato correttamente, si possono anche inviare mail, attraverso la funzione mail().
La sintassi generale di questa funzione è:
mail( mail_destinatario, oggetto_mail, testo_mail, intestazioni );
Tutti i parametri sono abbastanza chiari, l'unico che potrebbe suscitare un punto interrogativo è l'ultimo ovvero intestazioni ( headers ) che comprende tutte le informazioni aggiuntive ad esempio l'email di colui che la sta spedento, il nome del servizio, ecc... ecc...
[modifica] Invio di email semplici
Inziamo col mostrare l'invio di una mail semplice, cioè senza allegati o intestazioni complicate:
<?php
$email_destinatario = "prova@prova.it" // Modificatela con una vera
$email_mittente = "prova@php.it" // Modificatela a piacimento
$oggetto_email = "Hello PHP-Mail :)";
$testo_email = "Benvenuto nel magico mondo del PHP e delle mail ^_^\n";
$testo_email .= "A presto ;) con headers più lunghi!\n\n";
// Utilizzando il .= si aggiunge del testo alla stringa memorizzata precedentemente
$headers = "To: Nome destinatario <$email_destinatario>\n";
$headers .= "From: Nome mittente <$email_mittente>\n";
$headers .= "X-Mailer: PHP-Mail";
// Ovvero il servizio utilizzato per l'invio di questa email, può essere a
// piacimento il nome, in questo caso è PHP-mail ma come detto può essere
// cambiato.
if(!mail($email_destinatario, $oggetto_email, $testo_email, $headers))
echo "Email non inviata";
else echo "Email inviata";
?>
Come visto la funzione mail() restituisce 0 se l'invio non è andato a buon fine.
[modifica] Invio di email con allegati
L'invio di email con allegati è abbastanza complicata come cosa, dato che il php non fornisce un metodo semplice per farlo, ma con alcuni accorgimenti e con dei bei headers lo si può fare.
Innanzitutto nella pagina HTML in cui verrà inserito il form per il caricamento dell'allegato bisogna inserire enctype="multipart/form-data", facciamo un esempio:
<html>
<head>
<title>FORM per l'invio di email con allegati</title>
</head>
<body>
<form method="POST" action="mail.php" enctype="multipart/form-data">
Email destinatario: <input type="text" name="email_destinatario"><br>
Nome destinatario: <input type="text" name="nome_destinatario"><br>
Email mittente: <input type="text" name="email_mittente"><br>
Nome mittente: <input type="text" name="nome_mittente"><br>
Allegato: <input type="file" name="allegato"><br>
Oggetto mail: <input type="text" name="oggetto_email"><br>
Testo mail:<br>
<textarea name="testo_mail"></textarea><br>
<br>
<input type="submit" value="INVIA MAIL">
<input type="reset" value="Cancella tutto">
</form>
</body>
</html>
Ora i passi da seguire sono i seguenti:
- Recupero dati tramite POST
- Caricamento dell'allegato
- Creazione degli headers necessari per l'aggiunta dell'allegato
- Invio dell'email
Il recupero dei dati via POST ( o GET ) è già stato mostrato QUI, il caricamento dell'allegato avviene tramite $_FILES anche questo mostrato precedentemente QUI.
Il resto lo vedremo ora con questo codice, commentato nelle parti un pò più tortuose:
<?php
/* Recupero tutti i dati testuali con l'ausilio di $_POST e
la funzione stripslashes() che rimuove eventuali \\ o \' o \"
nel testo
*/
$email_destinatario = stripslashes($_POST['email_destinatario']);
$nome_destinatario = stripslashes($_POST['nome_destinatario']);
$email_mittente = stripslashes($_POST['email_mittente']);
$nome_mittente = stripslashes($_POST['nome_mittente']);
$oggetto_email = stripslashes($_POST['oggetto_email']);
$testo_email = stripslashes($_POST['testo_email']);
// Recupero dell'allegato
$allegato = $_FILES['allegato']['tmp_name'];
$allegato_type = $_FILES['allegato']['type'];
$allegato_name = $_FILES['allegato']['name'];
// Controllo la compilazione di tutti i campi
if ($email_mittente == NULL || $nome_mittente == NULL || $oggetto_email == NULL || /*
*/ $email_destinatario == NULL || $nome_destinatario == NULL || $testo_email == NULL )
echo "Devi compilare tutti i campi!";
else {
// Controllo che l'allegato sia stato caricato correttamente
if (is_uploaded_file($allegato))
{
/* Apro l'allegato in lettura ( in modalità binario così
da poter leggere qualunque tipo di formato */
$of = fopen($allegato,'rb');
// Memorizzo il contenuto di tutto il file nella variabile $data
$data = fread($file, filesize($allegato));
// Chiudo il file
fclose($of);
/* Inizio parte un pò tortuosa per la creazione degli headers */
// La funzione chunk_split() viene usata per ridurre una stringa
// in "pezzettini" più piccoli in modo da aderire alle specifiche
// indicate nella RFC 2045
// La funzione base64_encode() invece viene utilizzata per
// codificare una stringa in base64
$data = chunk_split(base64_encode($data));
// md5(time()) permette di avere l'ora corrente criptata in md5
$semi_rand = md5(time());
// Specifica il contenuto dell'email
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
$headers = "To: $nome_destinatario <$email_destinatario>\n";
$headers .= "From: $nome_mittente <$email_mittente>\n";
$headers .= "X-Mailer: PHP-Mail\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/mixed;\n";
$headers .= " boundary=\"{$mime_boundary}\"";
// Parte riguardante la parte testuale dell'email
$testo = "";
$testo .= "This is a multi-part message in MIME format.\n\n";
$testo .= "--{$mime_boundary}\n";
$testo .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
$testo .= "Content-Transfer-Encoding: 7bit\n\n";
$testo .= $testo_email . "\n\n";
// Parte riguardante l'allegato dell'email
$testo .= "--{$mime_boundary}\n";
$testo .= "Content-Disposition: attachment;\n";
$testo .= " filename=\"{$allegato_name}\"\n";
$testo .= "Content-Transfer-Encoding: base64\n\n";
$testo .= $data . "\n\n";
$testo .= "--{$mime_boundary}--\n";
// Invio dell'email
if(!mail($email_destinatario, $oggetto_email, $testo, $headers))
echo "L'email non è stata inviata";
else echo "L'email è stata inviata";
}
else echo "L'allegato non è stato caricato correttamente";
}
?>

