PHP - email con datos adjuntos

 
Vista:
sin imagen de perfil
Val: 34
Ha aumentado su posición en 3 puestos en PHP (en relación al último mes)
Gráfica de PHP

email con datos adjuntos

Publicado por Roberto (22 intervenciones) el 08/01/2022 15:47:16
Cordial saludo.
Envio un correo con un documento .docx adjunto.
el correo llega, pero al descargar el documento adjunto, este está corrupto, no abre

he ensayado con un archivo.zip, doc.docx y con foto.jpg
mi necesidad es descargar un documento .docx

algo debe estar mal

mi codigo es:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?php
 
		$txtNombre = "averiguo.com";
		$txtMail = "librosmagneticos@gmail.com";
		$txtFile = "doc.docx";
         $cabecera = "From: averiguo.com <info@averiguo.com>\r\n";
        $datos   = "Cuerpo del Mensaje";
        $mensaje = "Archivo adjunto";
        // Si se seleccionó un archivo, se adjunta:
         if( empty($txtFile) == false )
        {
            // Creamos una cadena aleatoria como separador:
             $separador = md5(uniqid(time()));
            // Comprobamos si el archivo fue subido, y leemos su contenido
             if(is_uploaded_file($txtFile))
             {
                  // Leemos el archivo obteniéndolo como una cadena de texto:
                  $archivo = fopen($txtFile, "rb");
                  $datos = fread( $archivo, filesize($txtFile) );
                  fclose($archivo);
 
                  // Dividimos la cadena de texto en varias partes más pequeñas:
                  $datos = chunk_split( base64_encode($datos) );
              }
            // Creamos la cabecera del mensaje:
             $cabecera .= "MIME-Version: 1.0\r\n".
                          "Content-Type: multipart/mixed; boundary=\"".$separador."\"\r\n\r\n";
            // Construimos el cuerpo del mensaje (para el texto):
             $mensaje  = "--".$separador."\r\n";
             $mensaje .= "Content-Type:text/plain; charset='iso-8859-1'\r\n";
             $mensaje .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
             $mensaje .= $_POST['txtMensaje']."\r\n\r\n";
            // Continuamos construyendo el cuerpo del mensaje, añadiendo el archivo:
             $mensaje .= "--".$separador."\r\n";
             $mensaje .=    "Content-Type: ".$txtFile."; name=".$txtFile."\r\n";
             $mensaje .= "Content-Transfer-Encoding: base64\r\n";
             $mensaje .= "Content-Disposition: attachment; filename=".$txtFile."\r\n\r\n";
             $mensaje .= $datos."\r\n\r\n";
            /*
                Si se fuera a insertar otro archivo, tras haber leído el contenido del mismo y haberlo cargado en otra
                variable, repetiríamos aquí las cinco líneas anteriores (cambiando el nombre del componente del formulario
                en $_FILES)
            */
            // Separador de final del mensaje
             $mensaje .= "--".$separador."--";
        }
        else
        {
            // No se adjuntó ningún archivo, enviamos sólo el texto del mensaje:
            $mensaje = "Mensaje de: ".$txtNombre.PHP_EOL;
            $mensaje .= "EMail: ".$txtMail.PHP_EOL.PHP_EOL;
            $mensaje .= $_POST['txtMensaje'];
        }
        // IMPORTANTE: debes sustituir la dirección de correo por aquella en que deseas recibir el EMail:
        $ok = mail( trim($txtMail), "Actuacion", $mensaje, $cabecera );
        if( $ok == true )
            echo "<p>El E-Mail ha sido enviado</p>";
 
 
?>

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro
Val: 1.634
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

email con datos adjuntos

Publicado por Alejandro (839 intervenciones) el 11/01/2022 01:05:23
  • Alejandro se encuentra ahora conectado en el
  • chat de PHP
Creo que la línea 35 y 37 debería ser así
1
2
3
$mensaje .=    "Content-Type: application/octet-stream; name=\"$txtFile\"\r\n";
...
$mensaje .= "Content-Disposition: attachment; filename=\"$txtFile\"\r\n\r\n";
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 34
Ha aumentado su posición en 3 puestos en PHP (en relación al último mes)
Gráfica de PHP

email con datos adjuntos

Publicado por Roberto (22 intervenciones) el 11/01/2022 13:18:32
Gracias por tu respuesta, hice los cambios que me recomienda, pero el documento .docx llega corrupto, igual que antes.
y cuando intento hacerlo con archivos .ZIP no llega el correo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 34
Ha aumentado su posición en 3 puestos en PHP (en relación al último mes)
Gráfica de PHP

email con datos adjuntos

Publicado por Roberto (22 intervenciones) el 12/01/2022 14:15:19
Gracias.
en la pagina de referencia hay un script,
este script tiene demasiados errores de programacion.
trate de acomodarlo a mi caso, pero no fui capaz.

creo que seguiré buscando
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 34
Ha aumentado su posición en 3 puestos en PHP (en relación al último mes)
Gráfica de PHP

email con datos adjuntos

Publicado por Roberto (22 intervenciones) el 18/01/2022 22:33:12
la solucion al problema es...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php
if($_POST && isset($_FILES['my_file'])) {
    $recipient_email = 'XXXXXXXX'; //Direccion de correo de quien recibe el mail
    $subject         = "Asunto del mensaje.";
 
    //Capturo los datos enviados por POST
    $from_email     = filter_var($_POST["email"], FILTER_SANITIZE_STRING);
    $sender_name    = filter_var($_POST["nombre"], FILTER_SANITIZE_STRING);
    $reply_to_email = filter_var($_POST["email"], FILTER_SANITIZE_STRING);
 
    //Armo el cuerpo del mensaje
    $message = "Nombre: " . $sender_name . "\n";
    $message = $message . "Email: " . $from_email . "\n";
 
    //Obtener datos del archivo subido
    $file_tmp_name    = $_FILES['my_file']['tmp_name'];
    $file_name        = $_FILES['my_file']['name'];
    $file_size        = $_FILES['my_file']['size'];
    $file_type        = $_FILES['my_file']['type'];
    $file_error       = $_FILES['my_file']['error'];
 
    if($file_error > 0)
    {
        die('Error al subir el archivo. No se adjunto ningun archivo');
    }
 
    //Leer el archivo y codificar el contenido para armar el cuerpo del email
    $handle = fopen($file_tmp_name, "r");
    $content = fread($handle, $file_size);
    fclose($handle);
    $encoded_content = chunk_split(base64_encode($content));
 
    $boundary = md5("pera");
 
    //Encabezados
    $headers = "MIME-Version: 1.0\r\n";
    $headers .= "From:".$from_email."\r\n";
    $headers .= "Reply-To: ".$reply_to_email."" . "\r\n";
    $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n";
 
    //Texto plano
    $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));
 
    //Adjunto
    $body .= "--$boundary\r\n";
    $body .="Content-Type: $file_type; name=".$file_name."\r\n";
    $body .="Content-Disposition: attachment; filename=".$file_name."\r\n";
    $body .="Content-Transfer-Encoding: base64\r\n";
    $body .="X-Attachment-Id: ".rand(1000,99999)."\r\n\r\n";
    $body .= $encoded_content;
 
    //Enviar el mail
    $sentMail = @mail($recipient_email, $subject, $body, $headers);
 
    if($sentMail) //Muestro mensajes segun se envio con exito o si fallo
    {
        echo"
            <h2>Gracias por tu contacto, $cvnombre</h2>
            <div>Tu mensaje fu&eacute; enviado con &eacute;xito.</div>
        ";
    }else{
        echo "
            <h2>Se produjo un error y su pedido no pudo ser enviado</h2>
        ";
    }
 
}
else{
    echo "
        <div>No se adjunt&oacute; ning&uacute;n archivo</div>
    ";
}
?>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar