Como enviar un correo en PHP (funcion mail)
17 marzo 2011 545 comentarios
Como enviar un correo electronico con la funcion mail() de PHP. A continuacion muestro un ejemplo muy basico pero que se podria adaptar a algo mas completo. La funcion mail() de PHP tiene el objetivo de enviar un correo electronico, la sintaxis es
mail($destinatario, $asunto, $mensaje, $encabezados);
donde:
destinatario: Es el correo electronico (puedes poner varios separados con coma) a quien se envia el mensaje,
asunto: O subject es el motivo por el cual envias el correol al destinatario.
mensaje: Es el mensaje en si, es decir la informacion que le deseas hacer llegar/informar al destinatario. Puedes escribir HTML si asi lo especificas en la cabecera. Las lienas como maximo pueden tener 70 letras (caracteres).
encabezados: En esta parte se agrega informacion sobre quien envía el mensaje (remitente), si el mensaje va ir con copia, con copia oculta (From, Cc y Bcc) , si tendrá formato html o solo texto, etc. Si se incluyen varias cabeceras se deben separar con retorno de carro y salto de linea (\r\n). Ejemplo de dos cabeceras:
/* Cabeceras donde se especifica a quien va dirigido (To), el remitente (From), A quien responder (Reply to), se envia copia a algunamigo@gmail.com (CC), una copia oculta a otroamigo@gmail.com (Bcc). */ $cabeceras = 'To: Pepito suemailchafa@mipaginaweb.com, Juanito <juanito@mipaginaweb.com>' . "\r\n" . 'From: webmaster@mipaginaweb.com' . "\r\n" . 'Reply-To: gonzasilve@gmail.com' . "\r\n". 'Cc: algunamigo@gmail.com' . "\r\n". 'Bcc: otroamigo@gmail.com' . "\r\n";
Bueno, basta de teoria, si tienes dudas puedes ver la documentacion oficial de la funcion mail(), esta muy completa y hay mas ejemplos. a continuacion muestro un ejemplo muy sencillo; basicamente consta de 3 archivos como se aprecia en la siguiente imagen:
Como se puede observar el archivo principal e inicial es el index.php y cada vez que se carga puede mostrar o el formulario para enviar un nuevo correo o un mensaje (informando que hubo fallo/exito en el envio del correo). Los archivos se describen brevemente a continuacion y se muestra su codigo y una imagen.
index.php
Este archivo es el punto de entrada del ejemplo, es la pagina principal y es el que muestra la informacion al usuario. Al abrirlo se comprueba si existe la variable estado (con ayuda de la funcion isset() ) y si no existe dentro de este archivo se «incrusta» o «inserta» otro archivo llamado cajamsg.html (con la funcion require); el cual es un formulario donde el usuario puede capturar los datos para enviar el correo, por el contrario si si existe se inserta un mensaje de exito/fracaso del envio del correo. Desde este archivo se envian los datos del formulario al archivo enviar_correo.php a travez del metodo POST.
<!-- Instituto Tecnologico de Zacatepec, Morelos Descripcion: Archivo principal que muestra un formulario (incrustado) para enviar un correo o muestra un mensaje avisando del exito/fracaso de un envio de correo. Author: Gonzalo Silverio gonzasilve@gmail.com Archivo: index.php --> <HTML> <HEAD> <TITLE>Pagina principal</TITLE> <link type="text/css" href="css/jquery.alerts.css" rel="stylesheet" /> <script type="text/javascript" src="js/jquery-1.7.2.min.js"></script> <script type="text/javascript" src="js/jquery.alerts.js"></script> <script type="text/javascript" src="js/jquery.validate.js"></script> <script type="text/javascript"> <!-- $().ready(function() { //$("#comentarios").validate(); $("#comentarios").validate({ rules: { /*A continuacion los nombres de los campos y sus reglas a cumplir */ nombr: { required: true }, elcorreo: { required: true, email: true }, asunt: { required: true }, elmsg: { required: true } } }); }); // --> </script> </HEAD> <BODY > <TABLE WIDTH="95%" align="center" cellspacing="0" cellpadding="0" border=1> <TR> <TD bgcolor="#F2F9FB" align="center"> <?php echo '<br><h2 align=center>Contacto</h2>'; //Si la variable de estado existe entrar y ver que valor tiene if( isset( $_GET['estado'] ) ) { if( $_GET['estado']=='enviado' ) { echo "<br><br>Su mensaje fue enviado correctamente"; echo "<br><br><a href='index.php'>VOLVER</a>"; } else if( $_GET['estado']=='no_enviado' ) { echo "<br><br><b>Upss!!,</b> Ocurrio un error. SU MENSAJE NO PUEDE SER ENVIADO EN ESTE MOMENTO."; } } else { echo 'Si lo deseas desde esta seccion puedes enviar un mensaje al administrador del sitio, algun comentario o sugerencia. <br>Cualquier critica constructiva sera bien recibida. <br><br>'; //muestra el formulario para capturar los datos del correo require("cajamsg.html"); } echo ' <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>'; ?> </TD> </TR> </TABLE> </BODY> </HTML>
Como se puede observar la forma de insertar el archivo cajamsg.html es por medio de la funcion require() de php. Con esta se puede incluir incluso otros scripts php. La funcion isset() comprueba o verifica si una variable dada existe y devuelve true en caso de que si. La variable estado unicamente existe (se crea, llega) despues de enviar un correo. A continuacion una imagen de este archivo en el navegador cuando se esta a punto de enviar un correo (abajo ahi un boton que dice Enviar Comentario):
Ahora se muestra este mismo archivo despues de que se ha enviado el mensaje anterior (se dio click en el boton):
Por el contrario, si el correo no se pudo enviar; se muestra igualmente un mensaje avisando.
cajamsg.html
Este archivo unicamente contiene un formulario para capturar los datos para el envio del correo. Este archivo se inserta en el archivo index.php con ayuda de la funcion require() de PHP. El codigo de este archivo es:
<!-- Instituto Tecnologico de Zacatepec, Morelos Descripcion: Formulario HTML para el envio de un correo en PHP. Author: Gonzalo Silverio gonzasilve@gmail.com Archivo: cajamsg.html --> <FORM id="comentarios" name="comentarios" method="POST" action="enviar_correo.php" > <table bgcolor="#C2E5FF" border="1"> <tr><td> <table bgcolor="#C2E5FF"> <tr> <td>Su nombre:</td><td><input type="text" id="nombr" name="nombr" value="" maxlength="90" size="30"><br></td> </tr> <tr> <td>Su correo electronico:</td><td><input type="text" id="elcorreo" name="elcorreo" value="" maxlength="50" size="30"><br></td> </tr> <tr> <td>Asunto:</td><td><input type="text" id="asunt" name="asunt" maxlength="50" size="30"><br></td> </tr> <tr> <td>Su mensaje:<br><br> (Puede usar HTML) </td><td><textarea rows="10" cols= "23" id="elmsg" name="elmsg" >Su comentario...</textarea><br></td> </tr> <tr> <td colspan="2" align="right"><input type="submit" value="Enviar Comentario" name="enviar"><br></td> </tr> </table> </td></tr> </table> </FORM>
Note en el codigo como se ha especificado que los datos se envian a traves del metodo POST al archivo enviar_correo.php. A continuacion una imagen de esta pagina web antes de insertarse en el ejemplo:
enviar_correo.php
Este archivo es el que manda a llamar a la funcion mail() de PHP y es el que envia realmente el correo a su destinatario. A este archivo le llegan los datos del formulario que se ha insertado en index.html. Como se puede ver a traves de la funcion header() se redirije el navegador al archivo index.php y se envia por el metodo GET el estado del exito/fracaso del la funcion mail(). He puesto algunos comentarios en el codigo:
<?php /* Instituto Tecnologico de Zacatepec, Morelos Descripcion: Archivo que usa la funcion mail() de php para enviar un correo electronico con datos que le llegan por el metodo POST. Author: Gonzalo Silverio gonzasilve@gmail.com Archivo: enviar_correo.php */ //Recuperar los datos que serviran para enviar el correo $seEnvio; //Para determinar si se envio o no el correo $destinatario = 'gonzasilve@gmail.com'; //A quien se envia $elmensaje = str_replace("\n.", "\n..", $_POST['elmsg']); //por si el mensaje empieza con un punto ponerle 2 $elmensaje = wordwrap($elmensaje, 70); //dividir el mensaje en trozos de 70 cols //Recupear el asunto $asunto = $_POST['asunt']; //Formatear un poco el texto que escribio el usuario (asunto) en la caja //de comentario con ayuda de HTML $cuerpomsg =' <html> <head> <title>Tienes un mensaje!!</title> </head> <body> <p>Holaa Gonza, alguien te mando un mensaje de tu pagina web http://gonzaslive.aegislinux.com.mx</p> <table> <tr> <td><b>Tu mensaje es:</b><br></td> </tr> <tr> <td>'.$elmensaje.'</td> </tr> <tr> <td><br><a href="http://gonzaslive.aegislinux.com.mx/ejemplos/enviar_correo/responder.php?correo='.$_POST['elcorreo'].'&asunto=FW: '.$asunto.'&nombre='.$_POST['nombr'].'">Responder</a></td> </tr> </table> </body> </html> '; //Establecer cabeceras para la funcion mail() //version MIME $cabeceras = "MIME-Version: 1.0\r\n"; //Tipo de info $cabeceras .= "Content-type: text/html; charset=iso-8859-1\r\n"; //direccion del remitente $cabeceras .= "From: ".$_POST['nombr']." <".$_POST['elcorreo'].">"; if(mail($destinatario,$asunto,$cuerpomsg,$cabeceras)) $seEnvio = true; else $seEnvio = false; //Enviar el estado del envio (por metodo GET ) y redirigir navegador al archivo index.php if($seEnvio == true) { header('Location: index.php?estado=enviado'); } else { header('Location: index.php?estado=no_enviado'); } ?>
Se puede ver claramente como le di formato al cuerpo del mensaje y como e guardado en una variable TODO el cuerpo de ese mensaje (una pagina web completa) para que se vea mas bonito al destinatario cuando lo abra. A continuacion muestro una imagen del mensaje en mi bandeja de entrada de gmail de que efectivamente me ha llegado el correo.
Ojo por que muchas veces estos mensajes llegan a la carpeta de spam (correo no deseado), en ese caso ahi que configurar la cuenta de correo ho avisar a los usuarios que revisen su carpeta de spam dependiendo de cual sea la situacion.
NUEVO
Como peticion del amigo Lucas que comento el 30 marzo 2012 a las 12:20 PM coloco un nuevo archivo PHP que permite responder un email. Este archivo se muestra al dar click en el enlace Responder que aparece al final del correo electronico, y rellena los campos del correo electronico, asunto y parte del comentario de respuesta.
responder.php
<?php /* Instituto Tecnologico de Zacatepec, Morelos Descripcion: permite responder un correo, le llega el email destino y el asunto Author: Gonzalo Silverio gonzasilve@gmail.com Archivo: responder.php */ $destinatario = ''; $nombreDestinatario = ''; $asunto = ''; if( isset($_GET['correo']) && $_GET['correo']!='' ) { //Recuperar los datos que serviran para responder el correo $destinatario = $_GET['correo']; //A quien se envia $nombreDestinatario = $_GET['nombre']; //Recupear el asunto $asunto = $_GET['asunto']; } ?> <HTML> <HEAD> <TITLE>Responder Correo eletronico</TITLE> </HEAD> <BODY > <TABLE WIDTH="95%" align="center" cellspacing="0" cellpadding="0" border=1> <TR> <TD bgcolor="#F2F9FB" align="center" > <br /> <table bgcolor="#C2E5FF" border="1"> <tr><td> <table bgcolor="#C2E5FF"> <FORM name="comentarios" method="POST" action="enviar_correo.php"> <tr> <td>Su nombre:</td><td><input type="text" name="nombr" value="" maxlength="90" size="30"><br></td> </tr> <tr> <td>Correo eletronico:</td><td><input type="text" name="elcorreo" value='<?=$destinatario ?>' maxlength="50" size="30"><br></td> </tr> <tr> <td>Asunto:</td><td><input type="text" name="asunt" value='<?=$asunto ?>' maxlength="50" size="30"><br></td> </tr> <tr> <td>Su mensaje:<br><br> (Puede usar HTML) </td><td><textarea rows="10" cols= "23" name="elmsg">Estimado <?=$nombreDestinatario; ?>, recibi su comentario y...</textarea><br></td> </tr> <tr> <td colspan="2" align="right"><input type="submit" value="Enviar Comentario" name="enviar"><br></td> </tr> </FORM> </table> </td></tr> </table> <br /><br /><br /><br /><br /><br /><br /><br /> </TD> </TR> </TABLE> </BODY> </HTML>
Aca una imagen de este archivo:
En resumen, como vez es un ejemplo muuy basico de como enviar correos, pero al menos sirve para darte una idea. Bueno eso es todo y espero comentarios o dudas acerca del ejemplo. Aca dejo un enlace del ejemplo en funcionamiento http://gonzaslive.aegislinux.com.mx/ejemplos/enviar_correo/.
Por fa!, si vas a probar el ejemplo, al menos escribe algo coherente y no envies campos vacios, pues de verdad que funciona (y me saturas el correo).
Si quieres el codigo ya sabes solo deja tu e-mail en este blog (no lo solicites por el formulario de prueba, ya que me llega a un email que no reviso a diario) y cuando abra mi bandeja te lo mando lo antes posible.
Gracias por visitar mi blog, see you.
Parece sumamente practico y funcional me gustaria probarlo
Hola, me podrias pasar el ejemplo: pviaut@outlook.com
Muchas gracias, me ha servido mucho.
un articulo muy bueno saludos.
Es excelente tu artículo y la solución que nos das para enviar el correo electrónico.
Te enviamos un cordial saludo desde OK Hosting.
Somos una empresa de hosting y servicios web de la ciudad de Guadalajara.
Saludos Cordiales!
Buenas tarde, excelente tutorial, me puedes regalar los archivos para analizarlos bien y no tener inconveniente.
Gracias, Dios te Bendiga. juzapo@yahoo.es
puedes dejame el codigo de envio de correos te lo agradeceria
Estimado Gonzalo Silverio
Muy buen proyecto el que presentas para el envio de correos, no se que tan factible pudiera ser que me mandes el código fuente del mismo para estudiarlo más a fondo y ocuparlo más frecuente para el fin del mismo.
Agradezco de antemano tu aportación
Atte.
Alejandro
por favor el codigo para enviar mensajer por correo
esta chido el trabajo..excelente enviamelo en mi correo porfa
Hola , podrías pasarme tu código completo.
muy bueno!
Saludos !
Excelente POST, podrías pasarme el código por favor yugieh@gmail.com
Saludos
hola m podrias enviar el formulario lombrizitayo@gmail.com
Buenos dias amigo me puedes compartir el codigo me interesa demasiado, ya que estoy realizando una web… muchas gracias mi correo es alexisnd@gmail.com
hola quisiera `probarlo ehm una pregunta cuando se envia el mensaje al que le llega se podria colocar una alerta que tiene mensaje nuevo que se dispare esa alerta mi correo maickdeath@gmail.com
Hola muy bueno, me podrías enviar el código completo? por favor… Mi correo es kidmc_7@hotmail.com
Enviame tu codigo y felicidades esta muy completo sombra_275@hotmail.com
porfa, podrias mandarme tus codigos, necesito hacer un trabajo y esto me seria de mucha ayuda, porfavor!! hector_mike92@hotmail.com
Excelente explicación, Enviame el codigo al correo: toluca_victor18@hotmail.com
hola me puedes enviar el codigo a este correo porfa omar.ledezma@incerpaz.com.bo porfa me gusto la explicacion que das sobre el envio de correos mediante php gracias
Muy bueno, en el link de mi nombre también esta muy bien explicado.
Hola excelente explicación, estoy desarrollando una DB y requiero de un formulario para contacto interno de un negocio entre departamentos, podrias compartir tu codigo, porfavor?
Hola muy bueno, y gracias por compartir conocimiento, podrías enviarme el código a carlos.virtualdesk@gmail.com ? la otra pregunta es si no tienes uno por ahi que al momento de inscribirse una persona en un form de inscripción, se vaya a una base de datos, y que se puedan ver los datos en una pagina? que se pueda exportar a excel y que mande una notificación a un correo en específico que sería el que revisa las inscripciones?
quedo atento a tus comentarios y muchas gracias.
saludos.
Hola, excelente proyecto. Estoy haciendo algo parecido, quiero enviar oficios dentro de una empresa. Sera posible que puedas enviarme el codigo completo a mi correo linnet_alha@hotmail.com.
De ante mano muchas gracias.
una pregunta, tengo una pizzeria que no para de mandarme mails a mi cuenta y no paran a pesar de que se los pido, les quiero mandar 5 mil mails para que aprendan, por php se puede hacer. Existirá alguna pagina en internet para poder mandar mail por php?? gracias
Podrías hacer un ciclo for para que los mande dentro del este metodo.
Con el ciclo se puede hacer eso, ahora la cuestión es encontrar algún hosting que te permita el envío de Spam… recuerdo hace años que mande 30 mensajes al con un ciclo y me bloquearon la cuenta del hosting…
Saludos