:::: MENU ::::

Envíar Email con PHP

Una de los problemas mas comunes en el desarrollo de un sistema web es el envío de correos, esto se puede hacer con la función mail() que permite enviar email de forma sencilla. La función mail() viene por defecto instalada en PHP y no necesita ninguna instalación adicional.

Sintaxis para enviar Email

La función mail() de PHP tiene la sintaxis:

mail($email, $subject, $mensaje, $headers);

Donde se tiene:

  • $email: Dirección de correo del destinatario.
  • $subject: Subject de correo a enviar.
  • $mensaje: es el cuerpo del mensaje.
  • $headers: encabezados de correo.

Ahora bien acerca del parámetro $header, este es una cadena de texto opcional donde se pueden incluir las direcciones adicionales del email (To, CC, BCC, Reply-To), esta cadena tiene la siguiente forma:

From: remitente@dominio.com\r\n
To: destino@dominio.com\r\n
CC: copia@dominio.com\r\n
BCC: copiaoculta@dominio.com\r\n
Reply-To: repondera@dominio.com\r\n

Entonces con las definiciones básicas ahora veamos un ejemplo de envío de correo.

Creando el Formulario

Primero tenemos que tener un formulario de HTML con los campos típicos para un formulario de contacto. El formulario para nuestro ejemplo tendrá los campos: nombres, empresa, email, telefono y comentarios.

<h2>Enviar Email con PHP</h2>
<form action="" method="post">
    Nombres <input name="nombre" id="nombre" type="text" /><br />
    Empresa <input name="empresa" id="empresa" type="text" /><br />
    Email <input name="email" id="email" type="text" /><br />
    Teléfono <input name="telefono" id="telefono" type="text" /><br />
    Mensaje <textarea name="mensaje" cols="30" rows="6"></textarea><br />
    <button name="btsend" id="btsend" type="submit">Enviar</button>
</form>

Envíando Email con PHP

El siguiente paso es crear un script PHP que reciba los datos del formulario, creamos la cadena de texto que deseamos enviar y finalmente hacemos el envío de email con la función mail().

$aviso = "";
if ($_POST['email'] != "") {
	// email de destino
	$email = "tuemail@tudominio.com";
	
	// asunto del email
	$subject = "Contacto";
	
	// Cuerpo del mensaje
	$mensaje = "---------------------------------- \n";
	$mensaje.= "            Contacto               \n";
	$mensaje.= "---------------------------------- \n";
	$mensaje.= "NOMBRE:   ".$_POST['nombre']."\n";
	$mensaje.= "EMPRESA:  ".$_POST['empresa']."\n";
	$mensaje.= "EMAIL:    ".$_POST['email']."\n";
	$mensaje.= "TELEFONO: ".$_POST['telefono']."\n";
	$mensaje.= "FECHA:    ".date("d/m/Y")."\n";
	$mensaje.= "HORA:     ".date("h:i:s a")."\n";
	$mensaje.= "IP:       ".$_SERVER['REMOTE_ADDR']."\n\n";
	$mensaje.= "---------------------------------- \n\n";
	$mensaje.= $_POST['mensaje']."\n\n";
	$mensaje.= "---------------------------------- \n";
	$mensaje.= "Enviado desde http://blog.unijimpe.net \n";
	
	// headers del email
	$headers = "From: ".$_POST['email']."\r\n";
	
	// Enviamos el mensaje
	if (mail($email, $subject, $mensaje, $headers)) {
		$aviso = "Su mensaje fue enviado.";
	} else {
		$aviso = "Error de envío.";
	}
}

Como se puede ver hemos creado los cuatro parámetros como variables: email de destino, asunto, cuerpo del mensaje y el header donde hemos colocado solo el remitente del mensaje. Podemos personalizar aún mas este formulario agregando mas campos de acuerdo a nuestras necesidades.

Hay que notar que estamos asumiendo que el usuario esta llenando todos los datos del formulario. Para mejorar este script haría falta hacer una validación de datos con Javascript antes de hacer el envío y también una validación de datos con PHP.


188 Comentarios

  • Tony |

    Hola, estoy diseñando un formulario, y todo perfecto, pero necesito lo sieguiente:

    El formulario solo va a llevar 2 Campos

    NOMBRE y EMAIL

    lo que necesito es que cuando el cliente metas sus datos en el formulario y le de ENVIAR. El formulario tome el correo del cliente que el coloco y le mande un correo a esa email, es decir que le autoresponda. Espero este claro mi duda

  • leonardo |

    Hola mi pregunta es la sig como tendria que hacer para que en el campo con copia pueda enviar mas de dos correos a a la vez??
    como seria esa programaacion? ya que la que tengo es asi
    ese es el campo del cc

    y esta es la programacion para que envie por cc $mail->Addcc ($cc = $_POST['cc']);
    pero solo puedo poner una direcccion en cada campo
    como deberia hacer para que sean varias a la ves???

    que me respondan lo antes posible gracias por el foro

  • jose |

    Ante todo felicitarte por el codigo, muy limpio.
    Mi pregunta es muy facil, al principio de cargar el formulario el formato de la letra es grande y cuando pulsas a enviar cambia a su tamaño de 12, como hago para siempre tenga ese tamaño de 12 ?? eso es lo que me descuadra la pagina.

    Un saludo

  • Diego |

    Hola envío el formulario correctamente y en la variable mailheaders tengo lo siguiente:

    $mailheaders = "From: britolaw \n";
    mail($recipient, $asunto, $msg, $mailheaders);

    en el encabezado del correo llega así:
    De: britolaw (//www.britolaw.com@webhosting.satnet.net)

    lo que quiero es que no salga “@webhosting.satnet.net”

  • eduar |

    hola amigo, he leido los comentarios y he probado el codigo pero no me funciona,la verdad no se mucho de esto de programacion web pero de verdad necesito la ayuda.

    el formulario lo colcas en una plantilla html y elcodigo php en una plantilla php o todo en la misma plantilla??
    ya instale el smtp y lo configure pero nada aun…

  • Federico Cetani |

    Muchas gracias, genio!

    Soy diseñador y la verdad que de lo que es código, toco poco pero sacaste de un gran apuro.

    Abrazo

  • Arturo |

    Como hago para que el usuario pueda escribir a quien enviar el mensaje? Todo se enviaria desde mi cuenta gmail

  • unijimpe |

    Para que el usuario pueda colocar el destinatario, lo primero es agregar un nuevo campo en el formulario, por ejemplo un campo llamado emailto.

    Destinatario: <input name="emailto" id="emailto" type="text" />

    Luego en el código PHP recoges el valor de ese campo y lo guardas en la variable

    $email = $_POST['emailto'];

  • mayu |

    hola tengo una duda yo estoy trabajando con un servidor local q es wamp y me tira este error
    mail() [function.mail]: SMTP server response: 550 The address is not valid. in C:\wamp\www\php-mail.php
    me podrian explikr el xq ?? porfavor

  • fatima |

    Hola una pregunta necesito incluir el SMPT de mi provedor pero no se en donde colocarlo en tu codigo podrias ayudarme

  • RAUL |

    Buenas Tardes, al pulsar el boton en mi web:

    on(release){
    getURL(“php-mail.php”, “_parent”);
    }

    no se me abre el formulario, me aparece el codigo php…PORQUE???
    Gracias.

  • mauro sanchez |

    no me funciona para nada … te queria pregunta como hacer una pagina un foro como este….si se puede saber aunque creo que tu vives de esto ….jajajajajaa

  • jose |

    quiero cambiarle el remitente a este codigo send.php

    <?
    /************************
    * Variables que puedes cambiar
    *************************/

    $mailto = "emailto@send.com";
    $cc = "";
    $bcc = "";
    $subject = "Formulario de contacto";
    $vname = "Contacto web";
    $email = $_POST['email'];

    function validateEmail($email)
    {
    if(eregi('^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z]{2,4}(\.[a-zA-Z]{2,3})?(\.[a-zA-Z]{2,3})?$', $email))
    return true;
    else
    return false;
    }

    if((strlen($_POST['name']) < 1 ) || (strlen($email) < 1 ) || (strlen($_POST['message']) < 1 ) || validateEmail($email) == FALSE){
    $emailerror .= '';
    if(strlen($_POST['name']) < 1 ){
    $emailerror .= 'Enter name';
    }
    if(strlen($email) < 1 ){
    $emailerror .= 'Enter email';
    }
    if(validateEmail($email) == FALSE) {
    $emailerror .= 'Enter valid email';
    }
    if(strlen($_POST['message']) < 1 ){
    $emailerror .= 'Enter message';
    }
    } else {
    $emailerror .= "Your email has been sent successfully";
    // NOW SEND THE ENQUIRY
    $timestamp = date("F j, Y, g:ia");
    $messageproper ="\n\n" .
    "Name: " .
    ucwords($_POST['name']) .
    "\n" .
    "Email: " .
    ucwords($email) .
    "\n" .
    "Website: " .
    ucwords($_POST['website']) .
    "\n" .
    "Company: " .
    ucwords($_POST['company']) .
    "\n" .
    "Comments: " .
    $_POST['message'] .
    "\n" .
    "\n\n" ;

    $messageproper = trim(stripslashes($messageproper));
    mail($mailto, $subject, $messageproper, "From: \"$vname\" \nReply-To: \"".ucwords($_POST['first_name'])."\" \nX-Mailer: PHP/" . phpversion() );
    }
    ?>

    deseo cambiar el remitente ya q sale el nombre del host y yo quiero ponerle mi: from: EMPRESA

  • Veronica |

    tengo este erorr y no se como solucionarlo me prodria ayudar se lo agradeceria muchismo

  • Veronica |

    ( ! ) Warning: mail() [function.mail]: Failed to connect to mailserver at “localhost” port 25, verify your “SMTP” and “smtp_port” setting in php.ini or use ini_set() in C:\wamp\www\suite.galapagos\enviar.php on line 30
    Call Stack
    # Time Memory Function Location
    1 0.0005 377568 {main}( ) ..\enviar.php:0
    2 0.0006 378600 mail ( ) ..\enviar.php:30

  • unijimpe |

    Jose, para colocar el nombre o email del remitente debes cambiar la propiedad From, en el ejemplo que mencionas:

    "From: \"$vname\" \nReply-To: ...
    Cambialo a:
    "From: \"tumail@tuempresa.com\" \nReply-To: ...

    Veronica en tu caso el mensaje sale por que no tienes instalado un servidor SMTP, este es un servidor que se encarga de hacer el envio de correos.

  • Valeria |

    Hola… como estan? implemente todo tu codigo pero no me llega el mail al correo destinatario… visualize con ECHO los datos a enviar y los toma correctamente, pero la funcion no toma los parametros indicados… ya que visualize con un ECHO la variable $vacio y sale “Error de envio”…

  • israel |

    Hola me sale el siguientiente error:
    Warning: mail() [function.mail]: Failed to connect to mailserver at “localhost” port 25, verify your “SMTP” and “smtp_port” setting in php.ini or use ini_set() in C:\inetpub\vhosts\relojeriamorlet.com\httpdocs\php-mail.php on line 31

    que hago!!!

  • jose luis |

    yo estoy usando un modem usb claro para conectarme a internet y ya instale el 1st Mail Server y dice que tengo una dirreccion ip dinamica y que contacte al proveedor.
    como hacer la ip fija sin contactar al servidor y cual seria el nombre del servidor smtp en el php.ini actualmente lo tengo configurado asi:
    [mail function]
    ; For Win32 only.
    SMTP =EQUIPO
    smtp_port=25

    ; For Win32 only.
    sendmail_from =thuching@gmail.com
    ; For Unix only. You may supply arguments as well (default: “sendmail -t -i”).
    ;sendmail_path =

  • Diego |

    Muy bueno el código, pasé horas buscando uno que fuese sencillo y funcionara y nada, hasta que encontre este, sencillamente perfecto, es fácil de entender y puedes modificarlo como quieras, incluso le puse un aspecto diferente con css y le agregue tambien para adjuntar imágenes.

    Muchas Gracias… admito que tuve que hacer unos ligeros cambios para usarlo como lo queria… pero me ha funcionado perfectamente.

  • ovidio |

    ante todo Hola

    tengo una duda, me baje el codigo que pusiste en el php.

    hay que tener 2 ficheros creados¿? si es asi como se deberian nombrar cada uno¿?

    Saludos

  • Mariade |

    Hola ujimpe ! enhorabuena me ha gustado mucho tu blog ! los artículos que he leido me parecen muy utiles e interesantes.

    Quería consultarte una duda, al intentar enviar un email con phpmailer y xampp me da error “failed From addres” y no se que puede ser, el caso es que he probado el servicio mercury y sí que me envía los email y tb me funciona la funcion mail() de php, podrías echarme una mano ?

    Muchas gracias ! Un cordial saludo !

  • ideasresponsables |

    Hola a todos, os escribo totalmente desesperado despues de mil intentos. Estoy haciendo una página web y estoy intentando hacer la relación entre el formulario de la pagina con el archivo .php que hace el envío. Hace por lo menos 2 años que intento hacer que me funcione un formulario, he descargado mil ejemplos de formularios html y php, he descargado mil plantillas de .php para que funcione, he cambiado los permisos a 777 y 755, he comprobado que el servidor (1and1) permite php…. pero aun asi nada.

    Hace tiempo le hice la pagina a un amigo y tuve que dejar el formulario que tenia originariamente porque no sabía hacer que funcionara…. y aun no lo consigo!!!!

    Se hacer el formulario con todos los campos,botones y todo,pero debo estar haciendo algo mal en el php o algo.
    Por favor necesito ayuda urgente porque la verdad es que me gustaría saber que hago mal o que no se hacer o que me falta para poder aprender a hacer el dichoso formulario.

    Por favor, si me pueden ayudar mi correo es ideasresponsablesgc@gmail.com

    Muchas muchas gracias de antemano.
    Raúl

    ———-ESTE ES EL FORMULARIO—————

    Nombre completo

    eMail

    Teléfono

    Mensaje

     

    ————–ESTE ES EL PHP———————-

    <?php

    $nombre = $POST['nombre'];

    $email = $_POST['email'];

    $telefono = $_POST['telefono'];

    $mensaje = $_POST['mensaje'];

    $header = 'From: ' . $email . "\r\n";

    $header .= "X-Mailer: PHP/" . phpversion() . "\r\n";

    $header .= "Mime-Version: 1.0 \r\n";

    $header .= "Content-Type: text/plain";

    $mensaje = "Mensaje enviado por " . $nombre . "\r\n";

    $mensaje .= "Su eMail es " . $email . "\r\n";

    $mensaje .= "Su telefono es " . $telefono . "\r\n";

    $mensaje .= "Mensaje: " . $_POST['mensaje'] . "\r\n";

    $mensaje .= "Enviado el " . date('d/m/Y', time());

    $para = 'MI_CORREO';

    $asunto = 'Mensaje desde Mi web';

    mail($para, $asunto, utf8_decode($mensaje), $header);

    echo 'Mensaje enviado con éxito

    Muchas gracias, pronto me pondré en contacto contigo.';

    ?>

    ——————————————————————————

  • Fernanda |

    En primer lugar, mil gracias por compartir este codigo.
    Tal como les ha sucedido a otros chicos, tal como esta aqui, al probarlo me arroja este error

    Warning: mail() [function.mail]: Failed to connect to mailserver at “localhost” port 25, verify your “SMTP” and “smtp_port” setting in php.ini or use ini_set() in ………………………………

    Mi consulta es la siguiente, si lo quiero probar desde mi maquina (localhost) debo tener un servidor SMTP configurado, siguiendo lo que comentas mas arriba. En este caso, solo basta con configurar ese programa y asegurarse de que en el php.ini diga SMTP= localhost?? O hay que configurar algo mas?

    Y en el caso que se maneje a traves de un hosting, debo modificar en el .ini donde dice SMTP=mail.misitio.com o algo mas?

    Gracias Unijimpe!

  • Artemisa |

    Hola amigo,estoy probando tu codigo pero no me funciona, al correrlo en primera instancia me envia un error php donde dice que la variable email no esta definida en la linea 4, osea en el $_POST['email'], y aun asi ingreso los datos del formulario y le doy enviar, y despues de un rato me envia el mensaje de que el mensaje fue enviado, pero reviso mi correo al que segun envie el correo y no llega nada… :/ que puedo hacer?

  • Isaac |

    Si tengo mi web y quiero que los mensajes del formulario salgan de una cuenta especifica de mi web. Ej: info@miweb.com
    Como puede agregar esto al formulario??
    Gracias!

  • Carlos |

    oye, de pura casualidad tendrás un post con este mismo formulario agregando la opción de AGREGAR ARCHIVO???

    MIL GRACIAS!

Publica tu comentario

En este blog los comentarios están moderados, serán mostrados cuando el administrador los apruebe. Por favor, evita comentarios ofensivos u obscenos por que no serán aprobados.
Si deseas publicar código fuente debes hacerlo entre las etiquedas <code> y </code>, además debes reemplazar los carácteres < por &lt; y > por &gt;.