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



¿Cómo enviar mail en php si el servidor no soporta la funcion mail() (ej. Prodigy Hosting)?
Friday April 07th 2006, 12:15 am
Filed under: PHP

Un problema muy común para algunos diseñadores web que no tienen amplia experiencia en programación es que tratan de instalar un formulario que envía a e-mail basandose en un script con la función de mail() de PHP y se topan con que el servidor no tiene configurado el programa de envío (sendmail) y por lo tanto, los correos no logran enviarse. Esto sucede en algunas compañías de hosting (por ejemplo Prodigy Hosting en México) o cuando el administrador del servidor no sabe como configurar PHP para envíar correos (en el archivo php.ini).

La solución más práctica es implementar el envío por medio de conexión directa a un servidor SMTP. Para ésto se necesitan básicamente dos cosas:

1.- El nombre de usuario, password y servidor SMTP de una cuenta de correo electrónico existente, y...

2.- Un script de PHP para envíar correo através de SMTP como el que se encuentra en: http://www.phpguru.org/downloads/smtp/

El archivo mencionado anteriormente debe de ser descargado y luego descomprimido (Mediante WinRAR, por ejemplo). Una vez descomprimido se encontrarán en él dos archivos: smtp.class.inc y example.php

Es necesario editar en el archivo example.php (que va a ser el que reciba la forma de envío de mail), lo siguiente: los campos del servidor SMTP, el login del mail, el password, el correo de destino así como las variables que reciben el mensaje desde la forma de envío. Todo esto puede sonar un poco complicado pero es bastante intuitivo una vez que se abre el archivo en un editor de texto. No hay nada que deba editarse en la clase smtp.