Enviar un formulario por correo electrónico con adjuntos

 
Este artículo esta basado en el anterior artículo Enviar un formulario por correo electrónico, añadiéndole la opción de que se le puedan pasar ficheros.

Al igual que la anterior función, esta puede recibir cualquier campo, con el añadido de que también puede recibir campos file.

El Código HTML de ejemplo es el originario del artículo anterior al que se le han añadido 2 campos file. Como en el anterior caso, se puede enviar cualquier campo (ahora incluyendo input type file) y en cualquier cantidad. Habría que cambiar el valor del atributo action del formulario "enviar_mail.php" por la página en la que vallamos a insertar el código PHP.

En el código:

  1. Se inician las variables, se establece la cabecera MIME, que permitirá enviar múltiples datos diferentes en el mail, como el texto con los campos del formulario en texto plano y los archivos.
  2. Se recogen los datos del formulario.
  3. Se recorren los ficheros enviados por el formulario de la variable global $_FILES.
    1. Si hay archivos, la primera vez se añaden las cabeceras para enviar un mail con múltiples tipos de datos ("Content-type: multipart/mixed;") y se crea un separador para el tipo de datos ("boundary=\"".$sSeparador."\"\n") entre el texto del mail y cada fichero enviado.
      Posteriormente se crean las cabeceras para el cuerpo del mensaje, definiendolo como texto plano ("Content-type: text/plain;charset=iso-8859-1\n"), se podría reemplazar "text/plain" por "text/html" y así poder pasar los datos en HTML.
    2. Se van añadiendo los archivos con sus cabeceras y cuerpos correspondientes, los datos son pasados por la variable global $_FILES en array asociativo.
  4. Por último se termina la cabecera y se añade al "cuerpo" del mensaje los datos de los archivos y se envía el mail.

Se muestran dos ejemplos de como usar. En el primero, enviaría el correo con los datos del formulario a "usuario_destino@dominio.com" y pondría como remitente a "usuario_enviado@dominio.com".
En el segundo ejemplo (comentado), se enviarían los datos a "usuario_destino@dominio.com", pero pondría como remitente, el campo "E-mail" pasado en el formulario de ejemplo, con el atributo name="E-mail". Si viniese otro campo con otro nombre, se debería reemplazar por este.


HTML:
<!-- Copyright © McAnam.com (Generador de formularios V. 1.1) -->
<!-- http://www.mcanam.com/generadores/html/formularios.php -->
<html>
    <head>
        <title>Rellene el formulario</title>
    </head>
    <body>
        <form name='formulario' id='formulario' method='post' action='enviar_mail.php' enctype="multipart/form-data">
            <p>Nombre <input type='text' name='Nombre' id='Nombre'></p>
            <p>Apellidos <input type='text' name='Apellidos' id='Apellidos'></p>
            <p>E-mail <input type='text' name='E-mail' id='E-mail'></p>
            <p><input type='radio' value='Hombre' name='Sexo' id='Sexo'>Hombre</p>
            <p><input type='radio' value='Mujer' name='Sexo' id='Sexo'>Mujer</p>
            <p>Adjuntar archivo1: <input type='file' name='archivo1' id='archivo1'></p>
            <p>Adjuntar archivo2: <input type='file' name='archivo2' id='archivo2'></p>
            <p align='center'>
                <input type='submit' value='Enviar formulario'>
                <input type='reset' value='resetear formulario'>
            </p>
        </form>
    </body>
</html>

Código:
<?php
// Copyright © McAnam.com
// http://www.mcanam.com/articulos/PHP.php?id=8
    
    function form_mail($sPara, $sAsunto, $sTexto, $sDe)
    {
    
        $bHayFicheros = 0;
        $sCabeceraTexto = "";
        $sAdjuntos = "";
        $sCuerpo = $sTexto;
        $sSeparador = uniqid("_Separador-de-datos_");
        
        $sCabeceras = "MIME-version: 1.0\n";
        
        // Recogemos los campos del formulario
        foreach ($_POST as $sNombre => $sValor)
            $sCuerpo = $sCuerpo."\n".$sNombre." = ".$sValor;
            
        // Recorremos los Ficheros
        foreach ($_FILES as $vAdjunto)
        {
            
            if ($bHayFicheros == 0)
            {
                
                // Hay ficheros
                
                $bHayFicheros = 1;
                
                // Cabeceras generales del mail
                $sCabeceras .= "Content-type: multipart/mixed;";
                $sCabeceras .= "boundary=\"".$sSeparador."\"\n";
                
                // Cabeceras del texto
                $sCabeceraTexto = "--".$sSeparador."\n";
                $sCabeceraTexto .= "Content-type: text/plain;charset=iso-8859-1\n";
                $sCabeceraTexto .= "Content-transfer-encoding: 7BIT\n\n";
                
                $sCuerpo = $sCabeceraTexto.$sCuerpo;
                
            }
            
            // Se añade el fichero
            if ($vAdjunto["size"] > 0)
            {
                $sAdjuntos .= "\n\n--".$sSeparador."\n";
                $sAdjuntos .= "Content-type: ".$vAdjunto["type"].";name=\"".$vAdjunto["name"]."\"\n";
                $sAdjuntos .= "Content-Transfer-Encoding: BASE64\n";
                $sAdjuntos .= "Content-disposition: attachment;filename=\"".$vAdjunto["name"]."\"\n\n";                 
                
                $oFichero = fopen($vAdjunto["tmp_name"], 'rb');
                $sContenido = fread($oFichero, filesize($vAdjunto["tmp_name"]));
                $sAdjuntos .= chunk_split(base64_encode($sContenido));
                fclose($oFichero);
            }
            
        }
        
        // Si hay ficheros se añaden al cuerpo
        if ($bHayFicheros)
            $sCuerpo .= $sAdjuntos."\n\n--".$sSeparador."--\n";
        
        // Se añade la cabecera de destinatario
        if ($sDe)$sCabeceras .= "From:".$sDe."\n";
        
        // Por último se envia el mail
        return(mail($sPara, $sAsunto, $sCuerpo, $sCabeceras));
    }
        
        //Ejemplo de como usar:
        if (form_mail("usuario_destino@dominio.com",
                                    "Activación de formulario",
                                    "Los datos introducidos en el formulario son:\n",
                                    "usuario_enviado@dominio.com"))
        echo "Su formulario ha sido enviado con exito";
        
        // Ejemplo de como usar, poniendo como remitente el campo pasado de E-mail
        /*
        if (form_mail("usuario_destino@dominio.com",
                                    "Activación de formulario",
                                    "Los datos introducidos en el formulario son:\n",
                                    $_POST["E-mail"]))
        echo "Su formulario ha sido enviado con exito";
        */
        

?>

Links relacionados:
Enviar un formulario por correo electrónico
Enviar un mail con PHP
Formulario HTML para enviar archivos al servidor
Generador de códigos para crear Formularios HTML
Formulario de contacto en Flash con adjunto
Validar todos los campos de un formulario
ASP, Enviar un mail con el objeto CDONTS NewMail


Para cualquier duda, consulta, sugerencia, opinión, colaboración, etc; no dude en ponerse en contacto con nosotros

Copyright © 2002-2014 [McAnam]. Reservados todos los derechos.
www.mcanam.com