Foros del Web » Programando para Internet » PHP »

mail() no adjunta ficheros correctamente!

Estas en el tema de mail() no adjunta ficheros correctamente! en el foro de PHP en Foros del Web. Buenas! Mi Problema: La funcion que utilizo para enviar mails no envia los ficheros adjuntos correctamente. Aqui les pongo el código utilizado: //Variables que se ...
  #1 (permalink)  
Antiguo 29/08/2003, 02:32
Avatar de jesusma  
Fecha de Ingreso: junio-2003
Ubicación: Sevilla (Spain)
Mensajes: 38
Antigüedad: 20 años, 10 meses
Puntos: 0
mail() no adjunta ficheros correctamente!

Buenas!

Mi Problema: La funcion que utilizo para enviar mails no envia los ficheros adjuntos correctamente.

Aqui les pongo el código utilizado:


//Variables que se pasan del formulario.
$subject = $_POST["subject"];
$mensaje = $_POST["mensaje"];
//Propiedades del archivo.
$archivo_name= $HTTP_POST_FILES['archivo']['name'];
$archivo_size= $HTTP_POST_FILES['archivo']['size'];
$archivo_type= $HTTP_POST_FILES['archivo']['type'];
$archivo= $HTTP_POST_FILES['archivo']['tmp_name'];
//$lim_tamano= $HTTP_POST_VARS['lim_tamano'];

//Composicion del mensaje.
$UN_SALTO="\r\n";
$DOS_SALTOS="\r\n\r\n";
//Separador de bloques.
$separador ="_separador".md5 (uniqid (rand()));


//Composicion de los destinatarios.
......
//Titulo del mensaje.
....
//Mensaje en texto Plano, viene del form.
....


//Cabeceras.
$cabecera ="Date: ".date("l j F Y, G:i").$UN_SALTO;
$cabecera .="MIME-Version: 1.0\n";
$cabecera .="From: ".$remitente."<".$remite.">\n";
$cabecera .="Return-path: ". $remite.$UN_SALTO;
$cabecera .="Reply-To: ".$responder.$UN_SALTO;
$cabecera .="X-Mailer: PHP/". phpversion().$UN_SALTO;

//Contenido para ficheros adjuntos.
$cabecera .= "Content-Type: multipart/mixed;".$UN_SALTO;
$cabecera .= " boundary=$separador".$DOS_SALTOS;
// Parte primera - Mensaje en formato PLANO (Si fuese HTTM bastaria con cambiar plain->html y el $mensaje que estuviera en HTML.
// Separador inicial
$texto ="--$separador".$UN_SALTO;
// Encabezado del texto plano.
$texto .="Content-Type: text/plain; charset=\"ISO-8859-1\"".$UN_SALTO;
$texto .="Content-Transfer-Encoding: 7bit".$DOS_SALTOS;
//Contenido de esta parte del mensaje
$texto .= $mensaje;

// Separador de partes

$adj1 = $UN_SALTO."--$separador".$UN_SALTO;

if ($archivo){
// Parte segunda - FICHEROS ADJUNTOS.

# Encabezado parcial

$adj1 .="Content-Type: ".$archivo_type ."; name=\"".$archivo_name."\"".$UN_SALTO;
$adj1 .="Content-Disposition: inline; filename=\"".$archivo_name."\"".$UN_SALTO;
$adj1 .="Content-Transfer-Encoding: base64".$DOS_SALTOS;

# lectura del fichero adjunto
$fp = fopen($archivo, "r");
$buff = fread($fp, filesize($archivo));
fclose($fp);
# codificación del fichero adjunto

$adj1 .=chunk_split(base64_encode($buff));


// separador final del mensaje
$adj2 .=$UN_SALTO."--$separador".$UN_SALTO;
}
// Unión de las diferentes partes para crear el cuerpo del mensaje
$mensaje=$texto.$adj1.adj2;
if( mail($destinatario, $titulo, $mensaje,$cabecera)){
echo "mensaje enviado";
}
else {
echo "mensaje NO enviado";
}


UFFFFFFFFFFFF!!!
Me pase, cortando y pegando.

Bueno, si tienen tiempo le echan una ojo y me comentan que puede estar erroneo.

Muchas gracias por vuestro tiempo y ayuda.

PD: Si alguien esta mas interesado en el tema que escriba un correo a mi direccion.

TA LUEGOOOOOOOOO
__________________
La mejor improvisación es la que se prepara.
  #2 (permalink)  
Antiguo 29/08/2003, 03:10
Avatar de nuevo  
Fecha de Ingreso: mayo-2003
Ubicación: Spain
Mensajes: 2.009
Antigüedad: 20 años, 11 meses
Puntos: 2
mira, cuando uses tanto codigo... para que los maestros lo puedan leer mejor, y mas rapido, solo tienes que colorearlo, para saber que es cada cosa, sin leer todo... ayudales y seras recompensado.

cuando empieces el codigo pones esto, pero sin el espacio en blanco que deje yo

[ php]

y cuando termines de poner tu code, pones esto sin el espacio en blanco

[ /php]


venga... cambialo cuando puedas... bueno, añade esas 2 cosillas.-., es como el bbcode
__________________
3w.valenciadjs.com
3w.laislatv.com
  #3 (permalink)  
Antiguo 29/08/2003, 04:44
Avatar de jesusma  
Fecha de Ingreso: junio-2003
Ubicación: Sevilla (Spain)
Mensajes: 38
Antigüedad: 20 años, 10 meses
Puntos: 0
Bueno! Gracias por el consejo, esto ya se ve mucho mejor.

AHHHHH! Se me olvido decir antes que, el servidor de correo saliente que uso es STMP (he visto por ahi que da algun que otro problema).

Aqui teneis, el codigo formateado (mas o menos, lo intereseante), pero el problema sigue siendo el mismo:
El mensaje plano, se escribe sin problema, pero
Los ficheros adjuntos los manda, pero no correctamente
(Ah decir verdad, solo manda unos cientos de bytes y ni siguiera del fichero que adjunto).

Código PHP:
//Variables que se pasan del formulario.
$subject $_POST["subject"];
$mensaje $_POST["mensaje"];
//Propiedades del archivo.
$archivo_name$HTTP_POST_FILES['archivo']['name'];
$archivo_size$HTTP_POST_FILES['archivo']['size'];
$archivo_type$HTTP_POST_FILES['archivo']['type'];
$archivo$HTTP_POST_FILES['archivo']['tmp_name'];
//$lim_tamano= $HTTP_POST_VARS['lim_tamano']; 

//Composicion del mensaje.
$UN_SALTO="\r\n";
$DOS_SALTOS="\r\n\r\n";
//Separador de bloques.
$separador ="_separador".md5 (uniqid (rand())); 

//Composicion de los destinatarios.
......
//Titulo del mensaje.
....
//Mensaje en texto Plano, viene del form.
....

//Cabeceras.
$cabecera ="Date: ".date("l j F Y, G:i").$UN_SALTO
$cabecera .="MIME-Version: 1.0\n"
$cabecera .="From: ".$remitente."<".$remite.">\n";
$cabecera .="Return-path: "$remite.$UN_SALTO;
$cabecera .="Reply-To: ".$responder.$UN_SALTO;
$cabecera .="X-Mailer: PHP/"phpversion().$UN_SALTO;

//Contenido para ficheros adjuntos.
$cabecera .= "Content-Type: multipart/mixed;".$UN_SALTO
$cabecera .= " boundary=$separador".$DOS_SALTOS
// Parte primera - Mensaje en formato PLANO 

// Separador inicial
$texto ="--$separador".$UN_SALTO
// Encabezado del texto plano.
$texto .="Content-Type: text/plain; charset=\"ISO-8859-1\"".$UN_SALTO
$texto .="Content-Transfer-Encoding: 7bit".$DOS_SALTOS
//Contenido de esta parte del mensaje
$texto .= $mensaje;

// Separador de partes

$adj1 $UN_SALTO."--$separador".$UN_SALTO

if (
$archivo){
// Parte segunda - FICHEROS ADJUNTOS. 

# Encabezado parcial

$adj1 .="Content-Type: ".$archivo_type ."; name=\"".$archivo_name."\"".$UN_SALTO
$adj1 .="Content-Disposition: inline; filename=\"".$archivo_name."\"".$UN_SALTO;
$adj1 .="Content-Transfer-Encoding: base64".$DOS_SALTOS

# lectura del fichero adjunto 
$fp fopen($archivo"r"); 
$buff fread($fpfilesize($archivo)); 
fclose($fp); 

//codificación del fichero adjunto 
$adj1 .=chunk_split(base64_encode($buff)); 

// separador final del mensaje 
$fin .=$UN_SALTO."--$separador".$UN_SALTO
}
// Unión de las diferentes partes para crear el cuerpo del mensaje 
$mensaje=$texto.$adj1.$fin;
if( 
mail($destinatario$titulo$mensaje,$cabecera)){
echo 
"mensaje enviado";
}
else {
echo 
"mensaje NO enviado";

Gracias. ta luegooooo.
__________________
La mejor improvisación es la que se prepara.
  #4 (permalink)  
Antiguo 30/08/2003, 16:27
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Prueba esta classe para sustituir a mail() de PHP completamente. Entre otras virtudes está la de adjuntar archivos a un mail con tan sólo una "línea de código" .. Enviar mails texto/plano o HTML (o en los dos formatos a la vez) .. enviar e-mails HTML con imágenes incrustradas y posibilidad de usar mail() de PHP o SMTP directo (y no uno sólo sino vários SMTP para balancear la carga ..).

Entre otras cosas es "buena" por qué incorpora y sigue al píe de la letra los standares del SMTP con los RFC's que corresponden ..

Yo la uso y vá de maravilla ..

PHP mailier:
http://phpmailer.sourceforge.net

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 30/08/2003, 16:57
 
Fecha de Ingreso: abril-2003
Mensajes: 656
Antigüedad: 21 años
Puntos: 1
Hola,

este escript creo que lo sacastes de "memeorias de un aprendiz"
EN http://www.rinconastur.com/php/index1.php,

yo tuve el mismo problema y lo solucione cambiando las variables de los saltos


$UN_SALTO="\n";
$DOS_SALTOS="\r\n";

a ver si te sirve

un saludo
  #6 (permalink)  
Antiguo 30/08/2003, 19:10
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Sobre los "saltos" de línea tienes una explicación del tema en una de las FAQ de este foro .. Todo depende del S.O. que se use:

En resumen:
\r\n --> Windows
\r --> Mac
\n --> Linux/otros


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #7 (permalink)  
Antiguo 01/09/2003, 04:14
Avatar de jesusma  
Fecha de Ingreso: junio-2003
Ubicación: Sevilla (Spain)
Mensajes: 38
Antigüedad: 20 años, 10 meses
Puntos: 0
gracias por la ayuda!! Estuve el fin de semana de relax.

Ahora lo pruebo y os cuento como ha ido!!

Gracias por vuestra maestria!! Campeones!!!!
__________________
La mejor improvisación es la que se prepara.
  #8 (permalink)  
Antiguo 02/09/2003, 05:23
Avatar de jesusma  
Fecha de Ingreso: junio-2003
Ubicación: Sevilla (Spain)
Mensajes: 38
Antigüedad: 20 años, 10 meses
Puntos: 0
Bueno, estuve probando algunas de las cosas que dijisteis y otras mas y sigo sin conseguir resultados.
Me he metido con la clase phpmailer (gracias cluster), pero sigo sin poder mandar na.
(no se envia ni el mensaje plano, jejeje voy para atrás)

Una ayudita, por misericordia.

Código PHP:
require("../phpmailer/mail.inc.php");
require(
"../phpmailer/class.smtp.php");
$mail->Host     $hostMailer;
$mail->From     $destinatarios;
$mail->FromName "Administrador de la Lista";
$mail->Host     $hostMailer;
$mail->Mailer   $mailer// es SMTP => $mail->IsSMTP()

$mail->Body    $mensaje;
$mail->AddAttachment($archivo$archivo_name"base64"$archivo_type) );  
//Donde $archivo se pasa por un form. 
//$mail->AddAttachment ($archivo, $archivo_name, $archivo_type); 
if($mail->Send()){
        echo 
"mande el mail";
}
else { echo 
"NO Se mando el mail";}
$mail->ClearAddresses();
$mail->ClearAttachments(); 
Esto es lo ultimo que he probado, pero sigue sin funcionar.

Gracias otra vez.
__________________
La mejor improvisación es la que se prepara.
  #9 (permalink)  
Antiguo 02/09/2003, 05:28
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

Simplemente para probar, en lugar de usar el fichero que envias por el formulario usa un fichero que tengas en el servidor. Si te lo envia bien, es que el envio de adjuntos esta bien, y lo que esta mal es la obtencion de los datos del fichero subido por el form.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #10 (permalink)  
Antiguo 02/09/2003, 05:29
Avatar de jesusma  
Fecha de Ingreso: junio-2003
Ubicación: Sevilla (Spain)
Mensajes: 38
Antigüedad: 20 años, 10 meses
Puntos: 0
okis, probando, probando.

Gracias josemi.
__________________
La mejor improvisación es la que se prepara.
  #11 (permalink)  
Antiguo 02/09/2003, 06:24
Avatar de jesusma  
Fecha de Ingreso: junio-2003
Ubicación: Sevilla (Spain)
Mensajes: 38
Antigüedad: 20 años, 10 meses
Puntos: 0
pues no, el fichero adjunto lo pasa bien.
De hecho, los ficheros .txt tambien llegan correptamente, pero no asi los ficheros .zip, .doc, .pdf.

En fin, seguiremos intentando cositas.

Si hay alguien al que se le ocurra algo, ya sabe.
Toda ayuda será bien recibida.

Saludos.
__________________
La mejor improvisación es la que se prepara.
  #12 (permalink)  
Antiguo 02/09/2003, 06:28
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Es decir, cogiendo el fichero del servidor envia todo tipo de ficheros. Y cuando usas el fichero subido, solo los .txt. ¿Cual es el tamaño de los ficheros que no llegan?
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #13 (permalink)  
Antiguo 02/09/2003, 06:34
Avatar de jesusma  
Fecha de Ingreso: junio-2003
Ubicación: Sevilla (Spain)
Mensajes: 38
Antigüedad: 20 años, 10 meses
Puntos: 0
Falso. Tanto los ficheros pasados como los del servidor, dan errores en la recepcion, salvo que sean .txt.
Los ficheros .zip, .doc etc, tanto si estan en el servidor como si se pasan, la recepcion en el correo es erronea.
Quiere decir esto, que el paso por el form es correcto, para cualquier tipo de fichero, el problema debe estar en el envio de mail, pero no consigo tener idea de donde.
El tamaño de fichoro en el php.ini es de 2M.

Saludos y gracias de ante mano.
__________________
La mejor improvisación es la que se prepara.
  #14 (permalink)  
Antiguo 02/09/2003, 06:38
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Bien. Paso siguiente. ¿Cual es el sistema operativo del servidor? Si es windows, para abrir ficheros binarios en fopen() debes usar 'rb'.

Otro asunto. ¿Cual es el valor de la directiva magic_quotes_runtime()? Si esta a on, los datos leidos con fread() se "escapan" con \. Mira en los comentarios de los usuarios de fread() (www.php.net/fread).

Prueba con un .html u otro fichero de texto. Porque creo que el problema va a ser los ficheros binarios.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #15 (permalink)  
Antiguo 02/09/2003, 06:47
Avatar de jesusma  
Fecha de Ingreso: junio-2003
Ubicación: Sevilla (Spain)
Mensajes: 38
Antigüedad: 20 años, 10 meses
Puntos: 0
okis, El sistema es window, como bien has supuesto. La inclusion de 'rb' lleva a un Warning:

Warning: stat failed for archivo (errno=2 - No such file or directory)
en la funcion fread(), veamos si con el magic_quote tiene algo que ver:

Muchisssiiiiiiiiiiiiimassssssssss gracias!!

Esto da nuevas esperanzas!!!
__________________
La mejor improvisación es la que se prepara.
  #16 (permalink)  
Antiguo 02/09/2003, 06:51
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
El 'rb' es en el fopen() en lugar de 'r', no en el fread().
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #17 (permalink)  
Antiguo 02/09/2003, 06:59
Avatar de jesusma  
Fecha de Ingreso: junio-2003
Ubicación: Sevilla (Spain)
Mensajes: 38
Antigüedad: 20 años, 10 meses
Puntos: 0
DONDE TENGO QUE MANDARTE EL JAMON!!!!!!!!!!!!!!!!!

juerrrrrrrr!!! Yo obcecao en que era en el mai() y resulta que era
en la abertura del fichero el 'rb' (te juro que es la primera vez que lo vi).

Parece que ahora si que lo manda correctamente, por lo menos lo ficheros, .zip y .doc.

Bueno, gracias otra vez. Sigue asi!!!! CAMPEON!!!

Nos vemos por aqui.
__________________
La mejor improvisación es la que se prepara.
  #18 (permalink)  
Antiguo 02/09/2003, 07:22
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Bueno, comprueba que sigue haciendolo bien con los .txt, no vaya a ser que arreglando uno se desarregle otro.

Sobre el jamon, no seria mala idea. Si alguna vez paso por sevilla, lo tendre en cuenta (el jamon quizas no, pero una copita ).

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:08.