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";
 }
?>
Strumenti personali