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 tambin que necesitamos que el usuario nos enve 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 informacin del usuario se enva instantneamente por correo electrnico. Cuando el formulario de contacto cuenta con un campo para cargar archivos, este archivo tambin debe enviarse como archivo adjunto. Mediante la funcin mail() puedes enviar perfectamente un correo con un archivo adjunto junto a los datos del propio formulario en PHP. En este tutorial te mostraremos cmo enviar email con adjunto al hacer submit en un formulario con PHP.

En el cdigo podrs ver cmo crear un formulario de contacto que contar con una opcin para cargar un archivo adjunto. Adems, enviaremos toda la informacin (tanto los datos de los campos como el propio fichero cargado por el usuario) a una direccin de correo especfica. Para una mejor comprensin, dividiremos el tutorial en dos partes. Por un lado, el HTML (formulario web) y por otro lado, el PHP (envo de formulario). Puedes poner ambas partes del cdigo juntas en la pgina 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 ms 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 cdigo gestiona la funcionalidad de enviar el correo al hacer submit en el formulario utilizando PHP.

  • Obtendremos la informacin del usuario con la variable $_POST
  • Validamos los datos del formulario para verificar si los campos obligatorios no estn vacos
  • Validamos la direccin de email utilizando FILTER_VALIDATE_EMAIL de PHP
  • Comprobamos la extensin del fichero
  • Subimos el archivo al servidor
  • Aadimos la informacin del formulario y el fichero al contenido del email
  • Enviamos el email con el fichero adjunto al destino seleccionado utilizando la funcin 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

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
ARTÍCULO ANTERIOR

¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.