Envíar Email con PHP

Este artículo ya se encuentra obsoleto.
Para una referencia actual leer: Enviar email con PHP y evitar que sea marcado como SPAM

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.

[download id=»43″ autop=»false»]

Comentarios Total 191 comentarios

=imperable=
Publicado: 17/08/2010 1:50 pm

hola amigo nesecito ayuda

Leoh
Publicado: 26/08/2010 2:49 pm

El script funciona perfecto pero llega como correo no deseado si colocamos como destinatario una cuenta de hotmail.
Me podrian decir cual seria el problema para que lleguen bien al buzon de entrada.
Gracias!

posicionamiento en buscadores
Publicado: 11/09/2010 4:25 am

Hola,

tengo el problema de que al enviar el formulario me aparece luego una pagina en blanco. Estoy intentando integrarlo a un blog pero no me esta funcionando

Hernan
Publicado: 17/09/2010 10:43 pm

hola amigo la verdad el formulario no llega ami correo ayudenme por favor

Una ayuda con un formulario PHP - psicofxp.com
Publicado: 23/09/2010 2:24 pm

[…] $mensaje, $headers) Si buscan "mail php" vas a esncontrar varios tutoriales. Ej: http://blog.unijimpe.net/enviar-e-mail-con-php/ http://www.alaingarcia.net/weird/mail_php.htm […]

Tony
Publicado: 29/10/2010 2:37 pm

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
Publicado: 16/11/2010 2:52 am

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
Publicado: 27/12/2010 1:58 pm

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
Publicado: 25/01/2011 5:07 pm

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
Publicado: 29/05/2011 3:54 am

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
Publicado: 01/06/2011 8:03 am

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
Publicado: 01/06/2011 2:48 pm

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

unijimpe
Publicado: 01/06/2011 10:18 pm

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'];

Arturo
Publicado: 03/06/2011 12:20 pm

Gracias gracias gracias!! era justo lo que queria

dexter_one
Publicado: 27/06/2011 1:28 am

Muchas gracias por este EXCELENTE articulo, se agradece tu trabajo.

Bytez!

mayu
Publicado: 30/06/2011 12:21 am

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
Publicado: 14/07/2011 3:24 pm

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

RAUL
Publicado: 27/10/2011 11:55 am

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
Publicado: 10/11/2011 6:13 pm

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
Publicado: 18/11/2011 9:28 am

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
Publicado: 18/11/2011 10:13 am

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

Veronica
Publicado: 18/11/2011 10:14 am

( ! ) 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
Publicado: 18/11/2011 10:33 am

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
Publicado: 02/12/2011 6:00 pm

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
Publicado: 14/12/2011 2:32 pm

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
Publicado: 12/01/2012 2:00 pm

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 =

bookmarks | Pearltrees
Publicado: 09/04/2012 11:30 pm

[…] Envíar Email con PHP | unijimpe } […]

Diego
Publicado: 26/06/2012 9:13 pm

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
Publicado: 26/07/2012 3:56 am

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
Publicado: 26/07/2012 11:45 am

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
Publicado: 08/08/2012 3:09 pm

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
Publicado: 17/09/2012 8:59 am

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!

aljan
Publicado: 22/11/2012 5:11 am

A quien no le llegue el correo debe de configurar el Mercury en XAMPP ;P

Artemisa
Publicado: 16/01/2013 10:52 am

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?

Gonzales
Publicado: 19/03/2014 12:37 pm

Hola disculpa he probado tu codigo y me dice que correo enviado correctamen pero al rebizar el correo no he llegado nada.
y mi pregunta es donde pongo este codigoy ademas tengo que configurar algo del php.ini ??
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

Guillermo
Publicado: 15/10/2014 6:54 am

Muy buen Aporte, Gracias

Isaac
Publicado: 17/10/2014 2:24 pm

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
Publicado: 24/10/2014 11:02 am

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

MIL GRACIAS!

Mario
Publicado: 10/11/2014 2:16 pm

Probado y trabajando, muchas gracias

Harold
Publicado: 09/04/2015 1:55 pm

Gracias

Ricardo
Publicado: 16/06/2015 2:45 pm

Aun funciona??
A mi siempre me sale «Error: mensaje no enviado»

 

Comentar

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

(Requerido)

(Requerido, no será publicado)

(Requerido)

(Tags aceptados: <a> <em> <strong> <code> <ul> <li>)