Invio di Email in PHP

Da WikiGuide.

Jump to: navigation, search
icona_distintivo.jpg
UFFICIALE,
Questa pagina è ufficiale ed è qui da ritenere attendibile.

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...

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.

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";
 }
?>
Personal tools