Google
 
Web www.rodrigomendez.com


PHP: ¿Cómo enviar un mail con archivos adjuntos (attachments)?
Monday June 12th 2006, 1:00 pm
Filed under: PHP

Este pequeño ejemplo que escribí muestra cómo enviar mail desde PHP incluyendo archivos adjuntos.

Lo primero que hacemos es generar la hoja HTML que tendrá la forma de envío. Los campos ilustrativos que vamos a usar para fines de éste ejemplo son nombre, e-mail, comentario y el archivo que deseamos adjuntar.

Archivo forma.html:

HTML:
  1. <form action = "envia_mail.php" method="post" enctype="multipart/form-data" name="form">
  2. <input type="text" name="nombre"/>
  3. <input type="text" name="email"/>
  4. <input type="text" name="comentario"/>
  5. <input type="file" name="file"/>
  6. </form>

De éste código lo único que sobresale es que como en todos los casos donde se envía un archivo a través de una forma, al tag

se le debe de agregar el atributo enctype="multipart/form-data" que especifica que no es solo texto lo que se está enviando.

Una vez que tenermos nuestra forma, procedemos a crear el script de PHP que recibirá los datos de la forma y enviará el mail.

Archivo envia_mail.php:

PHP:
  1. <?
  2.  
  3. if($file_type!="image/jpeg"&&$file_type!="image/pjpeg"){die("Tipo de archivo equivocado");} /// En esta linea validamos el tipo de archivo que se envia (ej. para evitar que se envien .exe con virus)
  4.  
  5. // Se lee el stream de bits del archivo que se envia
  6. $archivo=fopen($file, 'rb');
  7. $contenido=fread($archivo, filesize($file));
  8. $contenido=chunk_split(base64_encode($contenido));    //Se codifica el archivo para envio en base 64
  9. $tipo=filetype($file);
  10. fclose($archivo);
  11.  
  12.  
  13.  
  14.  
  15. // Se genera una cadena semi aleatoria para establecer el limite entre los tipos mime que vamos a mezclar (ej. txt, imagenes, etc.)
  16. $mime_boundary=md5(time());
  17.  
  18. // Comenzamos a conformar el mensaje
  19. $msg .= "From: emailejemplo@example.com \r\n"; // Direccion origen
  20. $msg .= "To: usuariox@example.com \r\n"; // Direccion destino
  21.  
  22. $msg .= "MIME-Version: 1.0 \r\n"// Version MIME a utilizar
  23. $msg .= "Content-Type: multipart/mixed; boundary=\"".$mime_boundary."\"\r\n\r\n"; // OJO: Importante, aqui estamos estableciendo el tipo de contenido de nuestro email como multipart/mixed debido a que va a tener mas de un solo tipo MIME conviviendo en el mismo mensaje, ya que estara el mensaje en si (en texto, html o ambos) y el archivo adjunto (imagen, doc, etc).
  24.  
  25. // Aqui vamos a realizar la inclusion del archivo adjunto
  26. $msg .= "--".$mime_boundary."\r\n"// Comenzamos delimitando el nuevo tipo MIME mediante la cadena de delimitacion antes generada (importante el doble guion --)
  27. $msg .= "Content-Type: $file_type; name=\"".$file_name."\"\r\n"; // Ponemos el tipo de archivo y su nombre (provenientes de la variable file que contiene el archivo)
  28. $msg .= "Content-Transfer-Encoding: base64 \r\n"; //Establecemos la codificacion de la transferencia como base 64
  29. $msg .= "Content-Disposition: attachment; filename=\"".$file_name."\"\r\n\r\n"; // Determinamos que el archivo viene adjunto al correo y no incluido en el documento
  30. $msg .= $contenido."\r\n\r\n"// Pegamos en el mensaje el contenido codificado de nuestro archivo
  31.  
  32.  
  33. // Comienzo del texto del correo (en este ejemplo lo vemos en HTML)
  34. $msg .= "--".$mime_boundary."\r\n"// Volvemos a delimitar el nuevo contenido de otro tipo MIME mediante la cadena delimitadora
  35. $msg .= "Content-Type: text/plain; charset=iso-8859-1 \r\n"//Establecemos el tipo MIME de esta seccion
  36. $msg .= "Content-Transfer-Encoding: 8bit\r\n\r\n"; //Establecemos la codificacion como 8bit
  37.  
  38. // Texto del correo
  39. $msg .="Se ha recibido un archivo de  ".$nombre." en la pagina web.\r\n";
  40. $msg .="\r\nE-mail: ".$email;
  41. $msg .="\r\nComentario: ".$comentario;
  42. $msg .= "\r\n\r\n"// OJO: Terminamos con doble salto de linea y retorno de carro
  43.  
  44.  
  45. // Terminamos el correo
  46. $msg .= "--".$mime_boundary."--"."\r\n\r\n"; // OJO: Muy importante poner dos guiones al principio y al final del delimitador MIME y el doble salto de linea y retorno de carro
  47.  
  48.  
  49. // Realizamos el envio de correo por medio de la funcion mail
  50. mail("maildestino@example.com","Comentario de la pagina web con archivo adjunto ","" ,$msg);
  51.  
  52. // Despues de esto podemos dar un mensaje de exito en el envio o lo que deseemos
  53.  
  54. ?>

Espero que les pueda ser util :D


1 Comment so far
Leave a comment

Muchas gracias, un post con mucha utilidad.
Saludos

Comment by Javi 06.19.06 @ 12:19 pm



Leave a comment
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

(required)

(required)