Attach fil
Hola! Estoy intentando hacer un formulario que envía email a mi cuenta de correo con el archivo adjunto que indique el usuario, en este caso, archivo .doc. Bien, pues me llega el mail con el asunto, el cuerpo y el archio, pero vacio. No entiendo mucho de PHP pero me hace falta urgentemente. qué está mal? Gracias.
<?
$fileatt = $_POST['archivo'];
$fileatt_name = $_POST['narchivo'];
$email_from = $_POST['suemail'];
$email_subject = "Envio de CV";
$file = fopen($fileatt, "r");
$contenido = fread($file,filesize($fileatt));
$encoded_attach = chunk_split(base64_encode($contenido));
fclose($file);
$asunto="CV desde la web";
$email="info@theplaygroundsite.com";
$mensaje= $_POST['sumensaje'];
$cabeceras = "From: nombre <info@theplaygroundsite.com>\n";
$cabeceras .= "Reply-To: $email\n";
$cabeceras .= "MIME-version: 1.0\n";
$cabeceras .= "Content-type: multipart/mixed; ";
$cabeceras .= "boundary=\"Message-Boundary\"\n";
$cabeceras .= "Content-transfer-encoding: 7BIT\n";
$cabeceras .= "X-attachments: $fileatt";
$body_top = "--Message-Boundary\n";
$body_top .= "Content-type: text/plain; charset=US-ASCII\n";
$body_top .= "Content-transfer-encoding: 7BIT\n";
$body_top .= "Content-description: Mail message body\n\n";
$cuerpo = $body_top.$mensaje;
$nombref = $fileatt_name;
$cuerpo .= "\n\n--Message-Boundary\n";
$cuerpo .= "Content-type: application/msword; name=\"$nombref\"\n";
$cuerpo .= "Content-Transfer-Encoding: BASE64\n";
$cuerpo .= "Content-disposition: attachment; filename=\"$nombref\"\n\n";
$cuerpo .= "$encoded_attach\n";
$cuerpo .= "--Message-Boundary--\n";
mail($email, $asunto, $cuerpo, $cabeceras);
?>
hartum
truqui del almendruqui:
Antes de nada le va usted colocando un pa r de barras -> // a la instruccion que envia el e-mail osease, asi:
//mail($email, $asunto, $cuerpo, $cabeceras);
y luego me hace usted un echo de las variables:
echo "El email es $email";
echo "El cuerpo es $cuerpo";
echo "Las cabeceras son $cabeceras";
esto deberia escribirte los resultados por pantalla, si no te pone nada es que no estan llegando las variables.
playground
Sí sí me llegan. De hecho me llega el archivo con su nombre y todo, vamos que esta bien, pero con 0kb :(
pau
Yo no domino PHP pero te puede estar ocurriendo lo siguiente ... :
El mail lo envía PHP que está en un servidor web, el fichero a adjuntar en el mail está en el PC del usuario que consulta la web.
Quizás lo tendrías que subir primero al servidor y luego enviar el mail.
playground
Gracias pau, probaré mañana al llegar al curro :)
playground
Efectivamente. Si pongo el archivo en el servidor si funciona, pero lo que quiero es que la persona seleccione uno desde una película de flash y que ese archivo sea el que llegue adjunto.
playground
Nada, si le paso al php la ruta de un archivo en el servidor guay pero si se la paso de un archivo en local, que es lo que necesito, nada de nada. Alguna idea? Socorro!!!
dagi3d
pues pasale la ruta del nuevo fichero subido, en lugar de solo el nombre. supongo que una vez este subido, prueba a sacarlo de la carpeta temporal con move_uploaded_file
gandalias
Bueno... Te mando como hago yo la transferencia de archivos... Espero que te sirva de algo (para php 4.2.0, creo)...
El Formulario
<form name="envioarchivo" action="validarformulario.php" method="post" enctype="multipart/form-data">
<input name="MAX_FILE_SIZE" type="hidden" value="2000000">
<input name="fichero" type="file">
<input type="submit" name="Submit">
</form>
El campo oculto le declaras con nombre "MAX_FILE_SIZE" con un valor. Este valor será el tamaño máximo que puede tener el archivo. Hay otro sitio donde se puede declarar este parámetro en el php.ini... Ahora no recuerdo pero por defecto creo que son 2 Mb.
Los datos has de mandarlos con el método post.
La Transferencia - validarformulario.php()
<?php
$upfile="";
// Miramos si hay algún fichero a transferir
$fichero_original=trim($_FILES['fichero']['name']);
if ($fichero_original!="") {
echo "<p>Transfiriendo Archivo de Imagen al Servidor...</p>";
// Variables para hacer el UPLOAD
$fichero=$_FILES['fichero']['tmp_name'];
$fichero_original=$_FILES['fichero']['name'];
$fichero_size=$_FILES['fichero']['size'];
$fichero_type=$_FILES['fichero']['type'];
$fichero_error=$_FILES['fichero']['error'];
// Depuración de errores de Carga de Archivo
// Comprobamos posible error de carga
if ($fichero_error > 0) {
echo "<p>Error en la carga del Archivo: ";
switch ($fichero_error) {
case 1: echo "El fichero excede la longitud máxima permitida en PHP.INI: 2Mb"; break;
case 2: echo "El fichero excede la longitud máxima permitida en Aplicación: 2Mb"; break;
case 3: echo "Fichero partido... Vuelva a Intentarlo"; break;
case 4: echo "Error Generico"; break;
}
echo "</p>";
exit;
}
// Verificar que se trata del archivo deseado y no una posible intrusión
if (is_uploaded_file($fichero)) {
// Sacamos de la carpeta temporal
$upfile="images/$fichero_original";
if (!move_uploaded_file($fichero,$upfile)) {
echo "<p>Problema al Transferir Archivo...</p>";
exit;
} else {
echo "<p>Archivo Transferido: $upfile</p>";
}
} else {
echo "<p>Posible ataque de carga...</p>";
exit;
}
} // If Comprobación de Anexo
?>
Espero que te sirva... Estudia esto y adaptalo a flash (creo que decias que esa era la interface...)
saludos!
playground
Hey !! muchas gracias, lo estoy mirando y creo que me va a servir.
playground
Pero no hay alguna forma de enviarlo directamente en el email como adjunto sin tener que subirlo al server?
dagi3d
supongo que si se pone el enctype a ocstream para enviar el fichero, no hace falte que muevas el fichero y se borraria automaticamente de la carpeta de archivos temporales si es eso lo que te preocupa.
de todas maneras, tiene que pasar por el server de alguna manera, eso es de cajon(recuerda, php es un lenguaje de servidor y de alguna manera te lo tendra que enviar a ti)
pedro_fm
gandalias, ese codigo que haces es para el upload, pero para el envío del mail ¿como se implementa?
playground
Se supone que una vez subido el archivo ya se puede enviar como adjunto y despues lo eliminas, pero tiene que haber una forma más fácil (en ASP es una línea de código!!!)
gandalias
Pedro...
ese codigo no lo uso para envio de adjuntos en un mail sino para subir imagenes de una base de datos de noticias en una Intranet. Lo del mail no se como sería pero supongo que como dice playground una vez tengamos el archivo en el servidor (en el ejemplo que puse yo la variable $upload) lo enviamos (con el código de playground...)
Playground...
El código que he puesto incluye depuración de errores. No obstante la instrucción clave aqui es el move_uploaded_file. Con solo este código tambien lo pasarías al server (donde userfile es el campo input type="file" name="userfile")
$fichero_tmp=$_FILES['userfile']['tmp_name'];
$fichero=$_FILES['userfile']['name'];
$upfile='adjuntos/'.$fichero;
move_uploaded_file($fichero_tmp,$upfile);
echo "Transferido";
Pero esta menos depurado. Eso como tu lo veas.
Por cierto. Respecto al codigo que has puesto para la confección del mail veo que haces el uuencode del contenido (hasta ahi creo que lo entiendo) pero no termino de comprender la importancia de la linea donde asignas el tipo de archivo ("Content-type: application/msword; name=\"$nombref\"\n";)... ¿Si pudieramos subir cualquier tipo de archivo cómo lo hariamos? ¿Necesitamos antes tener en una tabla las posibles extensiones y chequear la extensión y en base a eso asignar esa línea? ¿es realmente necesaria esa linea o se puede suprimir?.
Por cierto, esa depuración la saqué de "Desarrollo Web con PHP y MySQL" Autores: "Luke Welling y Laura Thomson" E. Anaya Multimedia. A mi me parece muy buen libro.
Saludos y gracias.
meddle
para comprobar las extensiones del archivo que se sube, yo uso esto:<code>//ALLOWED FILE TYPES:
$ext = array(".gif", ".jpg");
//make sure file type is supported
if(!in_array($file_name,$ext))
{
$error = "File type not supported. Supported files are ";
foreach( $ext as $exts ){
$error .= "$exts ";
}
die ("$error");
}
</code>
gandalias
Supongo que no se podrá hacer... pero más bien me refiero a si es posible determinar de alguna forma automática la parte referente a Content-type: application/laquesea con el valor correcto en función de la extensión. O si por el contrario necesitamos tener en alguna tabla externa, o en un array (como el que has puesto tu, meddle, pero con 2 dimensiones: 1 para el tipo y otra para la cadena de content-type) y realizar la busqueda nosotros en ese array y asignar...
¿O quizás el Content-type es un parámetro meramente informativo sobre el tipo de archivo y no es necesario pasar ese parámetro?¿Esto es lo que hace que cuando vemos el icono un archivo adjunto en el cliente de correo muestre el icono de la aplicación que lo abre?
1,2,3.. responda otra vez.... :)
salú y gracias!
meddle
¿que tal combinarlo con esto?
gandalias
jejeje
A eso me refería exactamente
gracias!
meddle
php rulez
de nada ;)
dagi3d
puedes tratar de usar el fichero mime.types de apache para saber que tipo de archivo es. mas completo que ese no creo que haya ;)