PHP | Enviar archivo adjunto con correo electrónico

Enviar un correo electrónico es una actividad muy común en un navegador web. Por ejemplo, enviar un correo electrónico cuando un nuevo usuario se une a una red, enviar un boletín informativo, enviar un correo de saludo o enviar una factura. Podemos usar la función mail() incorporada para enviar un correo electrónico mediante programación. Esta función necesita tres argumentos obligatorios que contengan la información sobre el destinatario, el asunto del mensaje y el cuerpo del mensaje. Junto con estos tres argumentos obligatorios, hay dos argumentos más que son opcionales. Uno de ellos es el encabezado y el otro son los parámetros. 
Ya hemos discutido el envío de correos electrónicos basados ​​en texto en PHP en nuestro artículo anterior . En este artículo, veremos cómo podemos enviar un correo electrónico con archivos adjuntos utilizando la función Mime-Versionmail().
Cuando se llama a la función mail(), PHP intentará enviar el correo inmediatamente al destinatario, luego devolverá verdadero al entregar el correo con éxito y falso si ocurre un error.
Sintaxis
 

bool mail( $to, $subject, $message, $headers, $parameters );

Aquí está la descripción de cada parámetro. 
 

Nombre Descripción Requerido/Opcional Escribe
a Contiene el destinatario o destinatarios del correo electrónico en particular. Requerido Cuerda
tema Esto contiene el asunto del correo electrónico. Este parámetro no puede contener caracteres de nueva línea Requerido Cuerda
mensaje Contiene el mensaje a enviar. Cada línea debe separarse con un LF (\n). Las líneas no deben exceder los 70 caracteres (Usaremos la función wordwrap() para lograr esto). Requerido Cuerda
encabezados Este contiene encabezados adicionales, como De, CC, Versión Mime y CCO. Opcional Cuerda
parámetros Especifica un parámetro adicional para el programa de envío de correo. Opcional Cuerda

Cuando enviamos correo a través de PHP, todo el contenido del mensaje se tratará solo como texto simple. Si colocamos cualquier etiqueta HTML dentro del cuerpo del mensaje, no se formateará como sintaxis HTML. La etiqueta HTML se mostrará como texto simple. 
Para formatear cualquier etiqueta HTML de acuerdo con la sintaxis HTML, podemos especificar la versión MIME (Extensión de correo de Internet multipropósito), el tipo de contenido y el juego de caracteres del cuerpo del mensaje. 
Para enviar un archivo adjunto junto con el correo electrónico, debemos establecer el tipo de contenido como mixto/multiparte y debemos definir las secciones de texto y archivo adjunto dentro de un límite .

Enfoque: asegúrese de tener un servidor XAMPP o un servidor WAMP instalado en su máquina. En este artículo, utilizaremos el servidor WAMP.

Siga los pasos que se indican a continuación:

Cree un formulario HTML : A continuación se muestra el código fuente HTML para el formulario HTML . En la etiqueta HTML <form> , estamos usando “ enctype=’multipart/form-data ”, que es un tipo de codificación que permite enviar archivos a través de un método POST . Sin esta codificación, los archivos no se pueden enviar a través del método POST. Debemos usar este enctype si desea permitir que los usuarios carguen un archivo a través de un formulario.

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
    <title>Send Attachment With Email</title>
</head>
<body>
    <div style="display:flex; justify-content: center; margin-top:10%;">
        <form enctype="multipart/form-data" method="POST" action="" style="width: 500px;">
            <div class="form-group">
                <input class="form-control" type="text" name="sender_name" placeholder="Your Name" required/>
            </div>
            <div class="form-group">
                <input class="form-control" type="email" name="sender_email" placeholder="Recipient's Email Address" required/>
            </div>
            <div class="form-group">
                <input class="form-control" type="text" name="subject" placeholder="Subject"/>
            </div>
            <div class="form-group">
                <textarea class="form-control" name="message" placeholder="Message"></textarea>
            </div>
            <div class="form-group">
                <input class="form-control" type="file" name="attachment" placeholder="Attachment" required/>
            </div>
            <div class="form-group">
                <input class="btn btn-primary" type="submit" name="button" value="Submit" />
            </div>           
        </form>
    </div>
</body>
</html>

Script PHP para manejar los datos del formulario :  

PHP

<?php
 
if(isset($_POST['button']) && isset($_FILES['attachment']))
{
    $from_email         = 'sender@abc.com'; //from mail, sender email address
    $recipient_email = 'recipient@xyz.com'; //recipient email address
     
    //Load POST data from HTML form
    $sender_name = $_POST["sender_name"]; //sender name
    $reply_to_email = $_POST["sender_email"]; //sender email, it will be used in "reply-to" header
    $subject     = $_POST["subject"]; //subject for the email
    $message     = $_POST["message"]; //body of the email
 
    /*Always remember to validate the form fields like this
    if(strlen($sender_name)<1)
    {
        die('Name is too short or empty!');
    }
    */   
    //Get uploaded file data using $_FILES array
    $tmp_name = $_FILES['attachment']['tmp_name']; // get the temporary file name of the file on the server
    $name     = $_FILES['attachment']['name']; // get the name of the file
    $size     = $_FILES['attachment']['size']; // get size of the file for size validation
    $type     = $_FILES['attachment']['type']; // get type of the file
    $error     = $_FILES['attachment']['error']; // get the error (if any)
 
    //validate form field for attaching the file
    if($error > 0)
    {
        die('Upload error or No files uploaded');
    }
 
    //read from the uploaded file & base64_encode content
    $handle = fopen($tmp_name, "r"); // set the file handle only for reading the file
    $content = fread($handle, $size); // reading the file
    fclose($handle);                 // close upon completion
 
    $encoded_content = chunk_split(base64_encode($content));
    $boundary = md5("random"); // define boundary with a md5 hashed value
 
    //header
    $headers = "MIME-Version: 1.0\r\n"; // Defining the MIME version
    $headers .= "From:".$from_email."\r\n"; // Sender Email
    $headers .= "Reply-To: ".$reply_to_email."\r\n"; // Email address to reach back
    $headers .= "Content-Type: multipart/mixed;"; // Defining Content-Type
    $headers .= "boundary = $boundary\r\n"; //Defining the Boundary
         
    //plain text
    $body = "--$boundary\r\n";
    $body .= "Content-Type: text/plain; charset=ISO-8859-1\r\n";
    $body .= "Content-Transfer-Encoding: base64\r\n\r\n";
    $body .= chunk_split(base64_encode($message));
         
    //attachment
    $body .= "--$boundary\r\n";
    $body .="Content-Type: $type; name=".$name."\r\n";
    $body .="Content-Disposition: attachment; filename=".$name."\r\n";
    $body .="Content-Transfer-Encoding: base64\r\n";
    $body .="X-Attachment-Id: ".rand(1000, 99999)."\r\n\r\n";
    $body .= $encoded_content; // Attaching the encoded file with email
     
    $sentMailResult = mail($recipient_email, $subject, $body, $headers);
 
    if($sentMailResult )
    {
    echo "<h3>File Sent Successfully.<h3>";
    // unlink($name); // delete the file after attachment sent.
    }
    else
    {
    die("Sorry but the email could not be sent.
                    Please go back and try again!");
    }
}
?>

Código completo: El código final para enviar archivos adjuntos con correos electrónicos es el siguiente:

PHP

<?php
 
if(isset($_POST['button']) && isset($_FILES['attachment']))
{
    $from_email         = 'sender@abc.com'; //from mail, sender email address
    $recipient_email = 'recipient@xyz.com'; //recipient email address
     
    //Load POST data from HTML form
    $sender_name = $_POST["sender_name"]; //sender name
    $reply_to_email = $_POST["sender_email"]; //sender email, it will be used in "reply-to" header
    $subject     = $_POST["subject"]; //subject for the email
    $message     = $_POST["message"]; //body of the email
 
    /*Always remember to validate the form fields like this
    if(strlen($sender_name)<1)
    {
        die('Name is too short or empty!');
    }
    */   
    //Get uploaded file data using $_FILES array
    $tmp_name = $_FILES['attachment']['tmp_name']; // get the temporary file name of the file on the server
    $name     = $_FILES['attachment']['name']; // get the name of the file
    $size     = $_FILES['attachment']['size']; // get size of the file for size validation
    $type     = $_FILES['attachment']['type']; // get type of the file
    $error     = $_FILES['attachment']['error']; // get the error (if any)
 
    //validate form field for attaching the file
    if($error > 0)
    {
        die('Upload error or No files uploaded');
    }
 
    //read from the uploaded file & base64_encode content
    $handle = fopen($tmp_name, "r"); // set the file handle only for reading the file
    $content = fread($handle, $size); // reading the file
    fclose($handle);                 // close upon completion
 
    $encoded_content = chunk_split(base64_encode($content));
    $boundary = md5("random"); // define boundary with a md5 hashed value
 
    //header
    $headers = "MIME-Version: 1.0\r\n"; // Defining the MIME version
    $headers .= "From:".$from_email."\r\n"; // Sender Email
    $headers .= "Reply-To: ".$reply_to_email."\r\n"; // Email address to reach back
    $headers .= "Content-Type: multipart/mixed;"; // Defining Content-Type
    $headers .= "boundary = $boundary\r\n"; //Defining the Boundary
         
    //plain text
    $body = "--$boundary\r\n";
    $body .= "Content-Type: text/plain; charset=ISO-8859-1\r\n";
    $body .= "Content-Transfer-Encoding: base64\r\n\r\n";
    $body .= chunk_split(base64_encode($message));
         
    //attachment
    $body .= "--$boundary\r\n";
    $body .="Content-Type: $type; name=".$name."\r\n";
    $body .="Content-Disposition: attachment; filename=".$name."\r\n";
    $body .="Content-Transfer-Encoding: base64\r\n";
    $body .="X-Attachment-Id: ".rand(1000, 99999)."\r\n\r\n";
    $body .= $encoded_content; // Attaching the encoded file with email
     
    $sentMailResult = mail($recipient_email, $subject, $body, $headers);
 
    if($sentMailResult ){
        echo "<h3>File Sent Successfully.<h3>";
        // unlink($name); // delete the file after attachment sent.
    }
    else{
        die("Sorry but the email could not be sent.
                    Please go back and try again!");
    }
}
?>
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
    <title>Send Attachment With Email</title>
</head>
<body>
    <div style="display:flex; justify-content: center; margin-top:10%;">
        <form enctype="multipart/form-data" method="POST" action="" style="width: 500px;">
            <div class="form-group">
                <input class="form-control" type="text" name="sender_name" placeholder="Your Name" required/>
            </div>
            <div class="form-group">
                <input class="form-control" type="email" name="sender_email" placeholder="Recipient's Email Address" required/>
            </div>
            <div class="form-group">
                <input class="form-control" type="text" name="subject" placeholder="Subject"/>
            </div>
            <div class="form-group">
                <textarea class="form-control" name="message" placeholder="Message"></textarea>
            </div>
            <div class="form-group">
                <input class="form-control" type="file" name="attachment" placeholder="Attachment" required/>
            </div>
            <div class="form-group">
                <input class="btn btn-primary" type="submit" name="button" value="Submit" />
            </div>           
        </form>
    </div>
</body>
</html>

Producción: 

 

PHP es un lenguaje de secuencias de comandos del lado del servidor diseñado específicamente para el desarrollo web. Puede aprender PHP desde cero siguiendo este tutorial de PHP y ejemplos de PHP .

Publicación traducida automáticamente

Artículo escrito por Saptarshi_Das y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *