Enviar email con adjunto al hacer submit en un formulario con PHP

Los formularios son elementos que se utilizan bastante en el entorno web. Son varios los tipos de formularios que podemos ver en Internet para enviar datos. Formularios de contacto, formularios de registro y formularios para dejar comentarios, por nombrar solo algunos. Por norma general, solemos utilizar campos de texto, desplegables y textarea para componer nuestros formularios. Pero hay casos también que necesitamos que el usuario nos envíe un fichero. En dichos casos, el usuario debe cargar el archivo seleccionado y adjuntarlo a los datos del formulario.

En casos como el formulario de contacto o el de dejar comentarios, la información del usuario se envía instantáneamente por correo electrónico. Cuando el formulario de contacto cuenta con un campo para cargar archivos, este archivo también debe enviarse como archivo adjunto. Mediante la función mail() puedes enviar perfectamente un correo con un archivo adjunto junto a los datos del propio formulario en PHP. En este tutorial te mostraremos cómo enviar email con adjunto al hacer submit en un formulario con PHP.

En el código podrás ver cómo crear un formulario de contacto que contará con una opción para cargar un archivo adjunto. Además, enviaremos toda la información (tanto los datos de los campos como el propio fichero cargado por el usuario) a una dirección de correo específica. Para una mejor comprensión, dividiremos el tutorial en dos partes. Por un lado, el HTML (formulario web) y por otro lado, el PHP (envío de formulario). Puedes poner ambas partes del código juntas en la página web donde desees integrar el formulario.

Formulario HTML con carga de ficheros

El siguiente HTML crea un formulario de contacto con ciertos campos muy basiquitos (Nombre, Email, Asunto y Mensaje) y un fichero para cargar archivos. Mediante este último campo, el usuario podrá seleccionar un fichero, que más tarde enviaremos por correo cuando se haga submit al formulario.

<!-- Display submission status -->
<?php if(!empty($statusMsg)){ ?>
    <p class="statusMsg <?php echo !empty($msgClass)?$msgClass:''; ?>"><?php echo $statusMsg; ?></p>
<?php } ?>

<!-- Display contact form -->
<form method="post" action="" enctype="multipart/form-data">
    <div class="form-group">
        <input type="text" name="name" class="form-control" value="<?php echo !empty($postData['name'])?$postData['name']:''; ?>" placeholder="Name" required="">
    </div>
    <div class="form-group">
        <input type="email" name="email" class="form-control" value="<?php echo !empty($postData['email'])?$postData['email']:''; ?>" placeholder="Email address" required="">
    </div>
    <div class="form-group">
        <input type="text" name="subject" class="form-control" value="<?php echo !empty($postData['subject'])?$postData['subject']:''; ?>" placeholder="Subject" required="">
    </div>
    <div class="form-group">
        <textarea name="message" class="form-control" placeholder="Write your message here" required=""><?php echo !empty($postData['message'])?$postData['message']:''; ?></textarea>
    </div>
    <div class="form-group">
        <input type="file" name="attachment" class="form-control">
    </div>
    <div class="submit">
        <input type="submit" name="submit" class="btn" value="SUBMIT">
    </div>
</form>

Enviar email con adjunto al hacer submit

El siguiente código gestiona la funcionalidad de enviar el correo al hacer submit en el formulario utilizando PHP.

  • Obtendremos la información del usuario con la variable $_POST
  • Validamos los datos del formulario para verificar si los campos obligatorios no están vacíos
  • Validamos la dirección de email utilizando FILTER_VALIDATE_EMAIL de PHP
  • Comprobamos la extensión del fichero
  • Subimos el archivo al servidor
  • Añadimos la información del formulario y el fichero al contenido del email
  • Enviamos el email con el fichero adjunto al destino seleccionado utilizando la función mail()
<?php
$postData = $uploadedFile = $statusMsg = '';
$msgClass = 'errordiv';
if(isset($_POST['submit'])){
    // Get the submitted form data
    $postData = $_POST;
    $email = $_POST['email'];
    $name = $_POST['name'];
    $subject = $_POST['subject'];
    $message = $_POST['message'];
    
    // Check whether submitted data is not empty
    if(!empty($email) && !empty($name) && !empty($subject) && !empty($message)){
        
        // Validate email
        if(filter_var($email, FILTER_VALIDATE_EMAIL) === false){
            $statusMsg = 'Please enter your valid email.';
        }else{
            $uploadStatus = 1;
            
            // Upload attachment file
            if(!empty($_FILES["attachment"]["name"])){
                
                // File path config
                $targetDir = "uploads/";
                $fileName = basename($_FILES["attachment"]["name"]);
                $targetFilePath = $targetDir . $fileName;
                $fileType = pathinfo($targetFilePath,PATHINFO_EXTENSION);
                
                // Allow certain file formats
                $allowTypes = array('pdf', 'doc', 'docx', 'jpg', 'png', 'jpeg');
                if(in_array($fileType, $allowTypes)){
                    // Upload file to the server
                    if(move_uploaded_file($_FILES["attachment"]["tmp_name"], $targetFilePath)){
                        $uploadedFile = $targetFilePath;
                    }else{
                        $uploadStatus = 0;
                        $statusMsg = "Sorry, there was an error uploading your file.";
                    }
                }else{
                    $uploadStatus = 0;
                    $statusMsg = 'Sorry, only PDF, DOC, JPG, JPEG, & PNG files are allowed to upload.';
                }
            }
            
            if($uploadStatus == 1){
                
                // Recipient
                $toEmail = '[email protected]';

                // Sender
                $from = '[email protected]';
                $fromName = 'Programacion.net';
                
                // Subject
                $emailSubject = 'Contact Request Submitted by '.$name;
                
                // Message 
                $htmlContent = '<h2>Contact Request Submitted</h2>
                    <p><b>Name:</b> '.$name.'</p>
                    <p><b>Email:</b> '.$email.'</p>
                    <p><b>Subject:</b> '.$subject.'</p>
                    <p><b>Message:</b><br/>'.$message.'</p>';
                
                // Header for sender info
                $headers = "From: $fromName"." <".$from.">";

                if(!empty($uploadedFile) && file_exists($uploadedFile)){
                    
                    // Boundary 
                    $semi_rand = md5(time()); 
                    $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 
                    
                    // Headers for attachment 
                    $headers .= "nMIME-Version: 1.0n" . "Content-Type: multipart/mixed;n" . " boundary="{$mime_boundary}""; 
                    
                    // Multipart boundary 
                    $message = "--{$mime_boundary}n" . "Content-Type: text/html; charset="UTF-8"n" .
                    "Content-Transfer-Encoding: 7bitnn" . $htmlContent . "nn"; 
                    
                    // Preparing attachment
                    if(is_file($uploadedFile)){
                        $message .= "--{$mime_boundary}n";
                        $fp =    @fopen($uploadedFile,"rb");
                        $data =  @fread($fp,filesize($uploadedFile));
                        @fclose($fp);
                        $data = chunk_split(base64_encode($data));
                        $message .= "Content-Type: application/octet-stream; name="".basename($uploadedFile).""n" . 
                        "Content-Description: ".basename($uploadedFile)."n" .
                        "Content-Disposition: attachment;n" . " filename="".basename($uploadedFile).""; size=".filesize($uploadedFile).";n" . 
                        "Content-Transfer-Encoding: base64nn" . $data . "nn";
                    }
                    
                    $message .= "--{$mime_boundary}--";
                    $returnpath = "-f" . $email;
                    
                    // Send email
                    $mail = mail($toEmail, $emailSubject, $message, $headers, $returnpath);
                    
                    // Delete attachment file from the server
                    @unlink($uploadedFile);
                }else{
                     // Set content-type header for sending HTML email
                    $headers .= "rn". "MIME-Version: 1.0";
                    $headers .= "rn". "Content-type:text/html;charset=UTF-8";
                    
                    // Send email
                    $mail = mail($toEmail, $emailSubject, $htmlContent, $headers); 
                }
                
                // If mail sent
                if($mail){
                    $statusMsg = 'Your contact request has been submitted successfully !';
                    $msgClass = 'succdiv';
                    
                    $postData = '';
                }else{
                    $statusMsg = 'Your contact request submission failed, please try again.';
                }
            }
        }
    }else{
        $statusMsg = 'Please fill all the fields.';
    }
}
?>

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR