Como enviar un correo en PHP (funcion mail)

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:

Logica de funcionamiento del ejemplo de envio de correo con PHP

Logica de funcionamiento del ejemplo de envio de correo con PHP

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):

Formulario de envio de correo.

Formulario de envio de correo.

Ahora se muestra este mismo archivo despues de que se ha enviado el mensaje anterior (se dio click en el boton):

Mensaje para el usuario avisandole que se a enviado su correo.

Mensaje para el usuario avisandole que se a enviado su correo.

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:

Formulario para enviar un comentario al webmaster

Formulario para enviar un comentario al webmaster

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.

Mensaje bandeja de entrada

Mensaje bandeja de entrada de Gmail

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:

Archivo para responder un correo

Archivo para responder un correo

 

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.

Acerca de gonzasilve
Freelance Web Developer.

545 Responses to Como enviar un correo en PHP (funcion mail)

  1. Parece sumamente practico y funcional me gustaria probarlo

  2. PAto says:

    Hola, me podrias pasar el ejemplo: pviaut@outlook.com

  3. Manuel Espejo says:

    Muchas gracias, me ha servido mucho.

  4. lucy says:

    un articulo muy bueno saludos.

  5. OK Hosting says:

    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!

  6. Buenas tarde, excelente tutorial, me puedes regalar los archivos para analizarlos bien y no tener inconveniente.

    Gracias, Dios te Bendiga. juzapo@yahoo.es

  7. juan says:

    puedes dejame el codigo de envio de correos te lo agradeceria

  8. Alejandro says:

    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

  9. gustavo says:

    por favor el codigo para enviar mensajer por correo

  10. ediberto says:

    esta chido el trabajo..excelente enviamelo en mi correo porfa

  11. Ulisses says:

    Hola , podrías pasarme tu código completo.
    muy bueno!

    Saludos !

  12. Luis says:

    Excelente POST, podrías pasarme el código por favor yugieh@gmail.com
    Saludos

  13. phoenixrios says:

    hola m podrias enviar el formulario lombrizitayo@gmail.com

  14. Alexis says:

    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

  15. maycoll says:

    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

  16. Randy says:

    Hola muy bueno, me podrías enviar el código completo? por favor… Mi correo es kidmc_7@hotmail.com

  17. beto says:

    Enviame tu codigo y felicidades esta muy completo sombra_275@hotmail.com

  18. Hector Miguel says:

    porfa, podrias mandarme tus codigos, necesito hacer un trabajo y esto me seria de mucha ayuda, porfavor!! hector_mike92@hotmail.com

  19. toluca says:

    Excelente explicación, Enviame el codigo al correo: toluca_victor18@hotmail.com

  20. omar says:

    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

  21. Muy bueno, en el link de mi nombre también esta muy bien explicado.

  22. Aldo Beltrán says:

    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?

  23. enrique says:

    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.

  24. 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.

  25. Juan says:

    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

    • Dex says:

      Podrías hacer un ciclo for para que los mande dentro del este metodo.

    • Hugo Dominguez says:

      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

Replica a juan Cancelar la respuesta