Foros del Web » Programando para Internet » PHP »

ayuda con attach en php

Estas en el tema de ayuda con attach en php en el foro de PHP en Foros del Web. que tal amigos, he buscado en el foro y vi distintas soluciones a enviar un mail con un archivo anexo (este lo envia sin necesidad ...
  #1 (permalink)  
Antiguo 19/04/2006, 11:37
 
Fecha de Ingreso: febrero-2004
Mensajes: 65
Antigüedad: 13 años, 9 meses
Puntos: 1
Pregunta ayuda con attach en php

que tal amigos, he buscado en el foro y vi distintas soluciones a enviar un mail con un archivo anexo (este lo envia sin necesidad de subirlo al server), pero me gustaria corregir el siguiente que les pongo, ya lo prove y si funciona pero solo estando tal cual, intento partirlo en 2 archivos, uno con la forma html y otro con el codigo php pero no funciona, es decir el script se ejecuta, no señala error pero no envia el mail (aunque esta validado) lo que detecte es que al parece ahi una malformacion en los headers pero no se donde esta el error, me gustaria que me ayudaran.

este es el codigo que si funciona tal cual:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>E-mail with Attachment</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php
if ($_SERVER['REQUEST_METHOD']=="POST"){

// we'll begin by assigning the To address and message subject
$to="[email protected]";

$subject="E-mail with attachment";

// get the sender's name and email address
// we'll just plug them a variable to be used later
$from = stripslashes($_POST['fromname'])."<".stripslashes($_POST['fromemail']).">";

// generate a random string to be used as the boundary marker
$mime_boundary="==Multipart_Boundary_x".md5(mt_ran d())."x";

// store the file information to variables for easier access
$tmp_name = $_FILES['filename']['tmp_name'];
$type = $_FILES['filename']['type'];
$name = $_FILES['filename']['name'];
$size = $_FILES['filename']['size'];

// here we'll hard code a text message
// again, in reality, you'll normally get this from the form submission
$message = "Here is your file: $name";

// if the upload succeded, the file will exist
if (file_exists($tmp_name)){

// check to make sure that it is an uploaded file and not a system file
if(is_uploaded_file($tmp_name)){

// open the file for a binary read
$file = fopen($tmp_name,'rb');

// read the file content into a variable
$data = fread($file,filesize($tmp_name));

// close the file
fclose($file);

// now we encode it and split it into acceptable length lines
$data = chunk_split(base64_encode($data));
}

// now we'll build the message headers
$headers = "From: $from\r\n" .
"MIME-Version: 1.0\r\n" .
"Content-Type: multipart/mixed;\r\n" .
" boundary=\"{$mime_boundary}\"";

// next, we'll build the message body
// note that we insert two dashes in front of the
// MIME boundary when we use it
$message = "This is a multi-part message in MIME format.\n\n" .
"--{$mime_boundary}\n" .
"Content-Type: text/plain; charset=\"iso-8859-1\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" .
$message . "\n\n";

// now we'll insert a boundary to indicate we're starting the attachment
// we have to specify the content type, file name, and disposition as
// an attachment, then add the file content and set another boundary to
// indicate that the end of the file has been reached
$message .= "--{$mime_boundary}\n" .
"Content-Type: {$type};\n" .
" name=\"{$name}\"\n" .
//"Content-Disposition: attachment;\n" .
//" filename=\"{$fileatt_name}\"\n" .
"Content-Transfer-Encoding: base64\n\n" .
$data . "\n\n" .
"--{$mime_boundary}--\n";

// now we just send the message
if (@mail($to, $subject, $message, $headers))
echo "Message Sent";
else
echo "Failed to send";
}
} else {
?>
<p>Send an e-mail with an attachment:</p>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"
enctype="multipart/form-data" name="form1">
<p>From name: <input type="text" name="fromname"></p>
<p>From e-mail: <input type="text" name="fromemail"></p>
<p>File: <input type="file" name="filename"></p>
<p><input type="submit" name="Submit" value="Submit"></p>
</form>
<?php } ?>
</body>
</html>


segun yo la manera de partirlo correctamente seria:

pagina1.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>E-mail with Attachment</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>

<p>Send an e-mail with an attachment:</p>
<form action="envia.php" method="post" enctype="multipart/form-data" name="form1">
<p>From name: <input type="text" name="fromname"></p>
<p>From e-mail: <input type="text" name="fromemail"></p>
<p>File: <input type="file" name="filename"></p>
<p><input type="submit" name="Submit" value="Submit"></p>
</form>

</body>
</html>

envia.php quedaria

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>E-mail with Attachment</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php

// we'll begin by assigning the To address and message subject
$to="[email protected]";

$subject="E-mail with attachment";

// get the sender's name and email address
// we'll just plug them a variable to be used later
$from = stripslashes($_POST['fromname'])."<".stripslashes($_POST['fromemail']).">";

// generate a random string to be used as the boundary marker
$mime_boundary="==Multipart_Boundary_x".md5(mt_ran d())."x";

// store the file information to variables for easier access
$tmp_name = $_FILES['filename']['tmp_name'];
$type = $_FILES['filename']['type'];
$name = $_FILES['filename']['name'];
$size = $_FILES['filename']['size'];

// here we'll hard code a text message
// again, in reality, you'll normally get this from the form submission
$message = "Here is your file: $name";

// if the upload succeded, the file will exist
if (file_exists($tmp_name)){

// check to make sure that it is an uploaded file and not a system file
if(is_uploaded_file($tmp_name)){

// open the file for a binary read
$file = fopen($tmp_name,'rb');

// read the file content into a variable
$data = fread($file,filesize($tmp_name));

// close the file
fclose($file);

// now we encode it and split it into acceptable length lines
$data = chunk_split(base64_encode($data));
}

// now we'll build the message headers
$headers = "From: $from\r\n" .
"MIME-Version: 1.0\r\n" .
"Content-Type: multipart/mixed;\r\n" .
" boundary=\"{$mime_boundary}\"";

// next, we'll build the message body
// note that we insert two dashes in front of the
// MIME boundary when we use it
$message = "This is a multi-part message in MIME format.\n\n" .
"--{$mime_boundary}\n" .
"Content-Type: text/plain; charset=\"iso-8859-1\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" .
$message . "\n\n";

// now we'll insert a boundary to indicate we're starting the attachment
// we have to specify the content type, file name, and disposition as
// an attachment, then add the file content and set another boundary to
// indicate that the end of the file has been reached
$message .= "--{$mime_boundary}\n" .
"Content-Type: {$type};\n" .
" name=\"{$name}\"\n" .
//"Content-Disposition: attachment;\n" .
//" filename=\"{$fileatt_name}\"\n" .
"Content-Transfer-Encoding: base64\n\n" .
$data . "\n\n" .
"--{$mime_boundary}--\n";

// now we just send the message
if (@mail($to, $subject, $message, $headers))
echo "Message Sent";
else
echo "Failed to send";
}

?>
</body>
</html>


pero no funciona nunca me dice "Failed to send", pero intente quitando los headers y si envia el mail pero al abrirlo ves puro codigo maquina, nada entendible, alguien me puede ayudar por favor?
__________________
eL MArgARo
  #2 (permalink)  
Antiguo 19/04/2006, 11:56
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Primero asegurate de que el archivo subió correctamente a tu servidor ...

De hecho ..

// open the file for a binary read
$file = fopen($tmp_name,'rb');

Esa forma de abrir un archivo desde el directorio temporal donde PHP sube todo archivo que pasa por el proceso de "upload" en muchas ocasiones (Safe Mode a ON .. y otro tipo de restricciones) no es posible hacer dicha taréa. En esos casos con esas restricciones debes primero "mover" el archivo con funciones tipo move_uploaded_file() a un directorio ubicado bajo el control de tu aplicación (sitio) y de ahí podrías usar ese "fopen()" como lo hece el código que presentas.

También ... debes tener presente que si estás usando un código -que no te funciona- .. lo primero es NO usar el operador (o como se llame): @ delante de funciones como:

if (@mail($to, $subject, $message, $headers))

así nunca veras los posibles mensajes de error y textuales (exactos) que pueda estar originando esa ejecución de esa función. Quitalo y observa el mensaje de error.

Por otro lado .. te recomendaría para evitar problemas usar la classe:

PHP Mailer
http://phpmailer.sourceforge.net

Te permite de forma cómoda enviar e-mails con archivos adjuntos .. en HTML .. multiparte .. etc y sigue los standares de las "RFC's" correspondientes para que no tengas (o los minimices) problemas con el envio del e-mail.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 19/04/2006, 12:00
 
Fecha de Ingreso: febrero-2004
Mensajes: 65
Antigüedad: 13 años, 9 meses
Puntos: 1
okedis!!

dejame le doy un vistazo a phpmailer, gracias!!!
__________________
eL MArgARo
  #4 (permalink)  
Antiguo 19/04/2006, 12:11
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
OJO que PHP Mailer no hace el proceso de "Upload" del archivo .. esa parte del código podrías usar el que presentas (con las advertencias que te hago y verificaciones .. ) sino, por mucho que uses "PHP Mailer" no resolveras el problema. PHP Mailer sólo se encarga de facilitarte la composición y envio de un e-mail y si ha de enviar archivos adjuntos al e-mail .. estos deben estar ya en el servidor (subidos a el por el método que corresponda: Formulario HTTP .. FTP .. etc).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
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 01:02.