Foros del Web » Programando para Internet » PHP »

enviar archivos adjuntos a email desde formulario

Estas en el tema de enviar archivos adjuntos a email desde formulario en el foro de PHP en Foros del Web. Tengo un script que no sé de donde lo saqué que permite enviar archivos adjuntos a un email desde un formulario. El problema es que ...
  #1 (permalink)  
Antiguo 01/02/2008, 07:53
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 22 años, 2 meses
Puntos: 2
enviar archivos adjuntos a email desde formulario

Tengo un script que no sé de donde lo saqué que permite enviar archivos adjuntos a un email desde un formulario.

El problema es que los archivos adjuntos llegan bien si utilizo un webmail para ver el email pero no se pueden descargar si veo el email en Outlook o en Thunderbird, quiero decir que lo que se ve de los archivos en el email es directamente el codigo en base64 (supongo que es eso, es un motón de letras y numeros seguidos donde debería estar el archivo)

A ver si podéis echarle un viztazo al código por si se puede arreglar esto:

Código PHP:
if ($_SERVER['REQUEST_METHOD']=="POST"){

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

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

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

   
// 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}\"";

   
// here, we'll start the message body.
   // this is the text that will be displayed
   // in the e-mail

    
$message"";


   
// next, we'll build the invisible portion of 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";
   
$message ="";


   
// now we'll process our uploaded files
   
foreach($_FILES as $userfile){
      
// store the file information to variables for easier access
      
$tmp_name $userfile['tmp_name'];
      
$type $userfile['type'];
      
$name $userfile['name'];
      
$size $userfile['size'];

      
// 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 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.
         // NOTE: we don't set another boundary to indicate that the end of the 
         // file has been reached here. we only want one boundary between each file
         // we'll add the final one after the loop finishes.
         
$message .= "--{$mime_boundary}\n" .
            
"Content-Type: {$type};\n" .
            
" name=\"{$name}\"\n" .
            
"Content-Disposition: attachment;\n" .
            
//" filename=\"{$fileatt_name}\"\n" .
            
" filename=\"{$name}\"\n" .
            
"Content-Transfer-Encoding: base64\n\n" .
         
$data "\n\n";
      }
   }
   
// here's our closing mime boundary that indicates the last of the message
   
$message.="--{$mime_boundary}--\n";
   
// now we just send the message
   
if (@mail($to$subject$message$headers))
      echo 
'éxito';
   else
      echo 
'fracaso';

  #2 (permalink)  
Antiguo 01/02/2008, 08:22
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 22 años, 2 meses
Puntos: 2
Re: enviar archivos adjuntos a email desde formulario

lo solucioné!
sustituyendo esto:
Código PHP:
$headers "From: $from\r\n" .
   
"MIME-Version: 1.0\r\n" .
      
"Content-Type: multipart/mixed;\r\n" .
      
" boundary=\"{$mime_boundary}\""
por esto:
Código PHP:
   $headers "From: $to\n" .
   
"MIME-Version: 1.0\n" .
      
"Content-Type: multipart/mixed;\n" .
      
" boundary=\"{$mime_boundary}\""
es decir, quitando los:

\r

vaya tontería, pero llevo toda la mañana con esto!
  #3 (permalink)  
Antiguo 01/02/2008, 08:25
Avatar de mrgubu  
Fecha de Ingreso: febrero-2002
Ubicación: Granada
Mensajes: 431
Antigüedad: 22 años, 2 meses
Puntos: 2
Re: enviar archivos adjuntos a email desde formulario

Me gustaría mejorar el script poniendo un límite al tamaño de los archivos a adjuntar: ¿podéis explicarme cómo hacerlo?
  #4 (permalink)  
Antiguo 01/02/2008, 08:58
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: enviar archivos adjuntos a email desde formulario

Ya tienes esta directiva:
Código PHP:
$size $userfile['size']; 
Solo agrega un if y compara si el $size es mayor al tamaño máximo que quieras permitir, y si no lo es, mandas un mensaje de error.

Saludos.
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 02:07.