Re: [PHP-ES] RE:[PHP-ES] Fallo al adjuntar archivos en mail
[email protected] (David Fraga)
| Newsgroups | php.general.es |
|---|---|
| Organization | nemondemand.com |
| Message-ID | <1304403482.2709.3.camel@david-Vostro-3500> |
Lo que debes passar a AddAttachment es la ruta del fichero, no el
contenido del fichero.
Si usas la versión 5.x, existe otro método llamado AddString (creo
recordar) para que puedas adjuntar contenido.
El lun, 02-05-2011 a las 17:20 +0000, Manoli Gil Muñoz escribió:
> He vuelto a repasar el ejemplo simple que hice con la clase PHPMailer (que lo tomé de internet) y ejecutarlo desde el servidor y me da el mismo problema que con lo que había hecho yo. Por supuesto he subido tanto el archivo "class.phpmailer.php" como "class.smtp.php" al servidor.
>
> Si alguien pudiera echarme una mano ya que no sé que más probar para hacerlo funcionar que estoy segura que debe ser una tontería pero no doy con la tecla.
>
> No sé si el problema está con el correo hotmail y gmail (ya que en ambos me ocurre lo mismo) o bien es algo que debo configurar en el servidor ya que me resulta extraño que algo le funciona a todos y a mí no.
>
> No pensé necesario comentar, pero por si acaso, que trabajo en una web simplemente con HTML, PHP y CSS aunque hay pequeños usos de Javascript donde no lo he podido evitar.
>
> El código del ejemplo simple usando PHPMailer es:
> <?php
> require("class.phpmailer.php");
> if ($_POST['action'] == "send") {
> $varname = $_FILES['archivo']['name'];
> $vartemp = $_FILES['archivo']['tmp_name'];
>
> $mail = new PHPMailer();
> $mail->Host = "localhost";
> $mail->From = "[email protected]";
> $mail->FromName = "Mi nombre";
> $mail->Subject = $_POST['asunto'];
> $mail->AddAddress($_POST['destino']);
> if ($varname != "") {
> $mail->AddAttachment($vartemp, $varname);
> }
> $body = "Esta mensaje es enviado a través de un formulario que hace uso de la clase PHPMailer.\n\n";
> $body.= $_POST['mensaje']."\n";
> $mail->Body = $body;
> $mail->IsHTML(true);
> $mail->Send();
> }
> ?>
> Y el formulario es tan sencillo como este:
> <form action="" method="post" enctype="multipart/form-data">
> Destinatario <input type="text" name="destino"><br>
> Asunto <input type="text" name="asunto"><br>
> Adjunto <input type="file" name="archivo"><br>
> Mensaje <textarea name="mensaje"></textarea><br>
> <input type="submit" name="btsend" value="Enviar Email">
> <input type="hidden" name="action" value="send" />
> </form>
>
>
> > Date: Thu, 28 Apr 2011 13:10:47 -0700
> > From: [email protected]
> > To: [email protected]
> > Subject: Re: [PHP-ES] Fallo al adjuntar archivos en mail
> >
> > Deberias buscar entre las funciones que tienes para el correo si tienes
> > alguna para adjuntar el archivo al correo
> > la forma en que lo estas haciendo solo lee el archivo y lo pega en el
> > contenido del correo, lo cual hace desplegar esos caracteres, si es el
> > contenido del archivo de word, pero no esta siendo adjuntado, si no pegado.
> >
> > La clase php-mailer tiene un metodo para adjuntar archivos, te podria servir
> > como referencia o hasta te podria resultar util el utilizarla.
> >
> > Espero te sirva de algo esto.
> >
> > El 28 de abril de 2011 12:50, Manoli Gil Muñoz <[email protected]>escribió:
> >
> > >
> > > 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);
> > >
>
signature.asc
(application/pgp-signature, 490 B)
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iQEcBAABAgAGBQJNv54XAAoJEMS7g35dsiRiCN0H/RP/oeyGVzhxAv2Y7esrAcCl iSAPS2pLjekaki6+Zu4cGSKamS/ajB1S0TVGnea8T7eprO5QTsKC2edHVFL70PiA +UGaThR+cBtI2es4Wkr4tInJgCgTK0mc3zqGtpRbXV2Ya/hHtcgeofI1NiMsO+MY 9rtw17q+8yc9046tAeXk9e5eVdq5bIFj8LxYfDoBwBBo9QyCmF775xaDW6tBQl4N MzNbGc60Pk/qt6QK0QEJZQcNU1lK7HbLi2mcEj3xDi7UX7/tH+VrFjiMI7EZlMNn jhHpmeFdmVkPgqUspeXc488rzqDeN4nD8MqkXSySd5D5Kz+9/KKtr2xPegRzP8M= =L5Zd -----END PGP SIGNATURE-----