Buenas tardes lista:
Tengo el siguiente problema a ver si alguien me puede ayudar. Voy a explicar primero el problema y luego expondré el código por si a alguien le interesa.
Tengo un formulario a través del cual se debe de adjuntar un archivo. Este archivo debe ser sólo de word, tipo .doc . Además el botón se tiene que llamar Adjuntar en lugar del típico Examinar.
Hasta ahí todo bien ya que tenía un sistema de subida de archivos al servidor. Así que lo que hago es a través de un botón normal y con Javascript abrir una ventana en la que se adjunta el archivo y se sube al servidor con un botón tipo file. Luego cuando se haya enviado el mail ya se borra dicho archivo para no sobrecargar el servidor. Todo eso perfecto.
Luego a través de otro código construyo el mail para enviarlo. Bueno, todo perfecto a excepción de que el archivo en lugar de venir adjunto viene en forma de caracteres en el cuerpo del mensaje.
Para probarlo me lo envío a mi cuenta de correo antes de poner la del cliente. Tengo una cuenta en hotmail y otra en gmail y en ambas llega el correo pero no adjunta el archivo sino que a continuación del cuerpo del mensaje me pone una ristra de caracteres que seguramente serán los correspondientes al archivo pero que no tiene que ver con su contenido. El aspecto es algo así:
----_Separador-de-mensajes_--
Content-type: ;name="Stonehenge.doc"
Content-Transfer-Encoding: BASE64
Content-disposition: attachment;filename="Stonehenge.doc"
0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAKgAAAAAAAAAA
EAAALAAAAAEAAAD+////AAAAACkAAAD///////////////////////////////////////////// .... y un montón de caracteres más.
Además lo que quiero es que aparezca el archivo adjunto y no el contenido insertado en el cuerpo.
El código de construcción y envío de mail con archivo adjunto funciona, puesto que lo he usado en otro servidor, además que lo he visto en varios sitios de internet. Sé que este problema le ha pasado a más personas pero nadie les ha proporcionado una respuesta. Llevo una semana mirando multitud de páginas sin encontrar lo que necesito.
He probado con la clase PHPMailer y tampoco funciona además los mensajes no llegan en formato html sino con todo el código html inscrustado en el mensaje.
Así que si alguien puede darme alguna idea estaré muy agradecida. Muchas gracias de antemano.
A continuación detallo código:
1º En el formulario tengo un botón:
<input type="submit" class="btn-adjunto-form" name="adjuntar" value="Adjuntar" onclick="abreVentana('./subir_trabajo.php')">
2º El archivo "subir_trabajo.php" lo único que hace es mostrar el típico botón de file para poder recoger el archivo y almacenarlo en el servidor utilizando la clase Uploads:
<?php
session_start();
$_SESSION['name'] = '';
$_SESSION['type'] = '';
$_SESSION['size'] = '';
$_SESSION['tmp_name'] = '';
$subidaok = $_SESSION['subidaok'];
if (isset($_REQUEST['subir'])) {
require_once("./librerias/Uploads.class.php");
$up = new Uploads();
$up->setExtensiones("doc");
$carpeta = ".";
$up->setCarpeta($carpeta,true); // El 2º valor lo pongo a true para que si la carpeta no existe la cree automaticamente
$up->setMaxTamano(3000000);
$up->setCampoForm("archivo");
if ($up->Subir()) {
echo "El archivo <b>".$up->getNombreArchivo()."</b> se ha adjuntado correctamente.<br>Cierre la ventana para finalizar de enviar el formulario.";
$_SESSION['name'] = $up->getNombreArchivo();
$_SESSION['type'] = $up->getExtension();
$_SESSION['size'] = $up->getTamano();
$_SESSION['tmp_name'] = $up->getArchivoSub();
$_SESSION['subidaok'] = true;
exit;
} else {
$error = $up->verErrores();
echo "<b>Se ha producido el siguiente error:</b><br><br>";
echo implode("<br>",$error);
echo "<br>Cierre la ventana y vuelva a intentarlo si lo desea teniendo en cuenta que sólo pueden ser archivos de word. (con extensión doc)<br><br>";
$_SESSION['subidaok'] = false;
exit;
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Subir Trabajos</title>
<link href='./estilos/estilos.css' rel='stylesheet' type='text/css'>
</head>
<body>
<fieldset class="adjuntos"><legend class="txt-legend">Subir Archivos</legend>
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post" enctype="multipart/form-data" name="form1" id="form1">
<label for="file" class="txt-form-gris">Archivo:</label>
<input type="file" name="archivo" class="btn-examinar" id="archivo">
<br><br>
<span class="txt-form-gris">(Sólo puede subir archivos doc)</span><br>
<input name="subir" type="submit" class="btn-form" id="subir" value="Enviar">
</form>
</fieldset>
</body>
</html>
3º Construyo el mensaje una vez comprobado que todos los datos son correctos y ayudada por una variable de sesión subidaok que controla que se haya subido al servidor el archivo y una vez enviado el mail elimino el archivo del servidor:
session_start();
$cuerpo = "Envío de trabajo desde el formulario\n\n";
$cuerpo .= "Título del trabajo: " . utf8_decode($_POST["titulo"]) . "\n\n";
$cuerpo .= "Nombre: " . utf8_decode($_POST['nombre'.$i]) . "\n";
@$archivo_Name = $_SESSION['name'];
@$archivo_Size = $_SESSION['size'];
@$archivo_Temp = $_SESSION['tmp_name'];
@$archivo_Mime_Type = $_SESSION['type'];
$sCabeceras = "From:".$sDe." - Desde el Formulario de inserción de trabajos \r\n";
$sCabeceras .= "MIME-version: 1.0\n";
if ($subidaok) {
$sCabeceras .= "Content-type: multipart/mixed;";
$sCabeceras .= "boundary=\"--_Separador-de-mensajes_--\"\n";
$sCabeceraTexto = "----_Separador-de-mensajes_--\n";
$sCabeceraTexto .= "Content-type: text/plain;charset=iso-8859-1\n";
$sCabeceraTexto .= "Content-transfer-encoding: 7BIT\n";
$cuerpo = $sCabeceraTexto.$cuerpo;
if ($archivo_Size > 0) {
$sAdjuntos .= "\n\n----_Separador-de-mensajes_--\n";
$sAdjuntos .= "Content-type: ".$archivo_Mime_Type.";name=\"".$archivo_Name."\"\n";
$nombreFichero = $archivo_Name;
$sAdjuntos .= "Content-Transfer-Encoding: BASE64\n";
$sAdjuntos .= "Content-disposition: attachment;filename=\"".$archivo_Name."\"\n\n";
$oFichero = fopen($archivo_Temp, 'r');
$sContenido = fread($oFichero, $archivo_Size);
$sAdjuntos .= chunk_split(base64_encode($sContenido));
fclose($oFichero);
}
}
if ($subidaok)
$cuerpo .= "\nEl mensaje incluye el archivo adjunto \"".$nombreFichero."\"\n".$sAdjuntos."\n\n----_Separador-de-mensajes_----\n";
$destinatario = "[email protected]";
$asunto = "Envío desde el Formulario";
$enviado = envio($destinatario,$asunto,$cuerpo,$sCabeceras);
$_SESSION['subdidaok'] = $subidaok = false;
if ($enviado) {
// Ahora eliminar el archivo del servidor
?> <script language=javascript> window.alert("Gracias por rellenar el formulario. Se ha enviado correctamente.\n"); </script> <?
} else {
?> <script language=javascript> window.alert("Lo lamento pero el env\xEDo ha fallado. Por favor, int\xE9ntelo de nuevo.\n"); </script> <?
}
unlink($archivo_Temp);