FAQ
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&oacute;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);

Search Discussions

  • Guillermo Rodriguez at Apr 28, 2011 at 8:10 pm
    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" "
    " rel="nofollow">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);
  • Juan Manuel Acuña Barrera at Apr 29, 2011 at 2:55 pm
    No mencionas que sistema operativo usas. En linux (desconozco si existe para otras plataformas) yo uso un programa que llamo desde shell_exec que se llama sendEmail de la siguiente forma:


    $comando="sendEmail ";
    $comando.=" -f $remitente ";
    $comando.=" -t $destinatario1 ";
    if(strlen($destinatario2)>5) $comando.=" -cc $destinatario2";
    if(strlen($destinatario3)>5) $comando.=" -cc $destinatario3";
    if(strlen($destinatario4)>5) $comando.=" -cc $destinatario4";
    $comando.=" -u $cabecera ";
    $comando.=" -m $cuerpo ";
    $comando.=" -s smtp.servidor.de.correo ";
    $comando.=" -xu $remitente ";
    $comando.=" -xp $password ";
    $comando.=" -a $file1 $file2 $file3"; // <---- Esta es la linea donde pongo los adjuntos

    $salida=shell_exec("$comando");

    Espero que te sirva.

    Suerte!

    El 28/04/2011, a las 15:10, Guillermo Rodriguez escribió:
    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" "
    " rel="nofollow">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);
  • Juan Manuel Acuña Barrera at Apr 29, 2011 at 8:20 pm
    En la página encontré que tienen versión para Windows :D !!!

    http://caspian.dotconf.net/menu/Software/SendEmail/

    A ver si te sirve.

    Suerte!

    El 29/04/2011, a las 13:54, Manoli Gil Muñoz escribió:
    Muchas gracias Juan Manuel pero estoy en Windows :(.

    De todas formas, siempre es interesante saber nuevas opciones, el saber no ocupa lugar.

    Aunque tengo linux en otro equipo antiguo pero no sé si lo podría adaptar para la web que estoy haciendo.

    De todos modos muchísimas gracias.

    From: [email protected]
    Date: Fri, 29 Apr 2011 09:55:11 -0500
    To: [email protected]
    Subject: Re: [PHP-ES] Fallo al adjuntar archivos en mail

    -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA1

    No mencionas que sistema operativo usas. En linux (desconozco si existe para otras plataformas) yo uso un programa que llamo desde shell_exec que se llama sendEmail de la siguiente forma:


    $comando="sendEmail ";
    $comando.=" -f $remitente ";
    $comando.=" -t $destinatario1 ";
    if(strlen($destinatario2)>5) $comando.=" -cc $destinatario2";
    if(strlen($destinatario3)>5) $comando.=" -cc $destinatario3";
    if(strlen($destinatario4)>5) $comando.=" -cc $destinatario4";
    $comando.=" -u $cabecera ";
    $comando.=" -m $cuerpo ";
    $comando.=" -s smtp.servidor.de.correo ";
    $comando.=" -xu $remitente ";
    $comando.=" -xp $password ";
    $comando.=" -a $file1 $file2 $file3"; // <---- Esta es la linea donde pongo los adjuntos

    $salida=shell_exec("$comando");

    Espero que te sirva.

    Suerte!

    El 28/04/2011, a las 15:10, Guillermo Rodriguez escribió:
    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" "
    " rel="nofollow">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);


    --
    PHP Spanish Localization Talk Mailing List (http://www.php.net/)
    To unsubscribe, visit: http://www.php.net/unsub.php
  • Manoli Gil Muñoz at May 2, 2011 at 5:20 pm
    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" "
    " rel="nofollow">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);
  • David Fraga at May 3, 2011 at 6:18 am
    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" "
    " rel="nofollow">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);

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupphp-general-es @
categoriesphp
postedApr 28, '11 at 7:50p
activeMay 3, '11 at 6:18a
posts6
users4
websitephp.net

People

Translate

site design / logo © 2023 Grokbase