Envío de mails desde PHP con smtp, autenticacion, ssl y otros.
Posted: Julio 28th, 2008 | Author: admin | Filed under: PHP, Recursos Web | Tags: Contacto, Formulario, Formulario de consulta, Mails, PHP, PHPMailer | 22 Comments »Enviar mails con PHP suele ser sencillo, utilizando la funcion mail() podemos hacerlo aunque no tenemos prácticamente fleixbilidad ni opciones. Casos típicos son cuando queremos enviar mails por smtp, utilizando una cuenta en particular, o nuestro servidor no tiene configurado un servidor local para PHP, o necesitamos una conexion SSL, etc.
Para estos casos podemos usar la clase phpmailer, que nos da todas estas opciones y más. La clase la pueden descargar de: phpmailer.codeworxtech.com
Lo único que necesitamos hacer luego de tener la clase descargada y colocada nuestro sitio, es incluir el archivo de la misma e instancia la clase:
require(“phpmailer/class.phpmailer.php”);
$mail = new PHPMailer();
Hecho esto pasamos a definir mail de origen, destino, nombre, etc.:
$mail->From = $mailfrom; // Mail de origen
$mail->FromName = $name; // Nombre del que envia
$mail->AddAddress($para); // Mail destino, podemos agregar muchas direcciones
$mail->AddReplyTo($mailfrom); // Mail de respuesta
Luego definimos el contenido del mail:
$mail->WordWrap = 50; // Largo de las lineas
$mail->IsHTML(true); // Podemos incluir tags html
$mail->Subject = “Consulta formulario Web: $name”;
$mail->Body = “Nombre: $name \n<br />”.
“Email: $mailfrom \n<br />”.
“Tel: $tel \n<br />”.
“Mensaje: $info \n<br />”;
$mail->AltBody = strip_tags($mail->Body); // Este es el contenido alternativo sin html
Podemos adjuntar archivos simplemente agregando los mismos de la siguiente forma:
$mail->AddAttachment(“nombredearchivo.txt”); // Ingresamos la ruta del archivo
Y ahora viene la parte divertida (no solo me pica el…errr), definimos el servidor que enviara el mail, podemos definir tipo de servidor, autenticacion, usuario, contraseña, etc. Vemos ejemplo de las posibilidades que tenemos.
Si vamos a enviar mail desde el servidor local sin configuración especial podemos usar:
$mail->Host = ‘localhost’;
Si necesitamos utilizar una casilla de correo smtp, con user y pass:
$mail->IsSMTP(); // vamos a conectarnos a un servidor SMTP
$mail->Host = “mail.servidor.com”; // direccion del servidor
$mail->SMTPAuth = true; // usaremos autenticacion
$mail->Username = “info@servidor.com”; // usuario
$mail->Password = “pass”; // contraseña
Si necesitamos una conexion con SSL, por ejemplo para enviar un mail desde PHP con gmail:
$mail->Mailer = “smtp”;
$mail->Host = “ssl://smtp.gmail.com”;
$mail->Port = 465;
$mail->SMTPAuth = true;
$mail->Username = “burmauy@gmail.com”; // SMTP username
$mail->Password = “burmaUY123456″; // SMTP password
Como ven esta clase es muy flexible y nos olvidamos de tener que manejar nosotros mismos conexiones complejas o con cabeceras especiales. Podemos simplificarnos mucho la vida utilizando phpmailer para enviar mails.
Ya para enviar el correo, simplemente utilizamos la siguiente linea:
$mail->Send();
Podemos poner esa llinea dentro de un if para saber si quedo todo bien configurado y se pudo enviar el email, de la siguiente forma:
if ($mail->Send())
echo “Enviado”;
else
echo “Error en el envio de mail”;
Me ha venido de perlas tu explicación. Era justo lo que necesitaba, autentificación SMTP para mis formularios, ya que estoy experimentando problemas de SPAM.
Mil gracias
y como se envia el mail?, a lo mejor es una pregunta tonta pero creo que no se menciona nunca
Tienes toda la razon, agregada la linea de envio =)
estoy generando imagenes de codigos de barras que se envian al usuario por mail, cada imagen tiene un codigo aleatorio llamado $cad y es el mismo nombre para los codigos de barras $cad.jpg
trato de enviarlo por correo pero no llegan
quisiera que me dijeras que puede ser,
cuando le pongo la ruta directa si llegan pero cuando utilizo una variable como ruta el mail no llega con el archivo
he intentado estas dos formas.
$fichero=”/barcodes_imagenes/”.$cad.”.jpg”;
$fichero=$_SERVER['DOCUMENT_ROOT'].’/ULSA/barcodes_imagenes/’.$cad.’.jpg’;
Cuando pones la ruta tienes que armar la ruta completa. Prueba hacer un echo de la ruta que guardas en $fichero y prueba que al pegar esa ruta en la barra de direcciones aparezca la imagen.
Otra opcion puede ser enviar la imagen como un adjunto, lo explico en este mismo post como hacerlo.
Hola
Un favor me podrias hechar la mano con la validacion de este php que esta alojado en la pagina de contacto de la direccion que te puse la verdad es que no se programar en php y no le hayo te pongo el php:
<?php
$recipient = $_POST["recipient"];
$subject = $_POST["subject"];
$department = $_POST["department"];
$name = $_POST["name"];
$email = $_POST["email"];
$message = “To the “.$department.” department\r\n\r\n”.$_POST["message"];
$headers = ‘From: ‘.$name.’ ‘ . “\r\n”;
if (mail($recipient, $subject, $message, $headers)) {
echo(“status=ok”);
} else {
echo(“status=failed”);
}
?>
Y este va dirigido al correo
info@salonyjardinsoleil.com.mx
Gracias por tu tiempo
Mario
Primero que nada, fijate que estes enviando los mails de forma correcta. Esto lo pruebas poniendo valores a las variables a mano, por ejemplo:
$subject = “Prueba 1″;
Luego que logres hacerlo andar asi, fijate que los campos del formulario coincidan en el name con los que pones en el codigo, y que el form este en post.
Te recomiendo que busques alguien que te de una mano, ya que no tienes filtrado de codigo en las variables POST. Pueden inyectar codigo malicioso…
Saludos y consulta cualquier cosa.
Hola como estan, estoy armando un sistema de envio masivo de mail, todo funciona bien, pero me faltaria que me muestre en numero la cantidad de mail que va enviando, yo ahora tengo un print, pero la verdad queda medio desprolijo, mi idea es queme muenstre en numero la candidad de mail enviados, desde ya muchas gracias.
hola, tengo un problema, no he podido establecer el nombre del host, la pregunta es que si se omite esto ¿funciona?. Cómo puedo ver el típo de “inconveniente” que se presenta al no enviar el correo?, es decir… algún “or die”
Gracias
gracias el error 530 de autenficacion me estaba dejando loco!!!!!!!!!!!!!!
Hola, segui el tutorial al pie de la letra… pero a la hora de darle click al boton de send me parece la pantalla en blanco y de ahi no pasa. Llevo muchos tutoriales y no puedo hacer q corra mi formulario. Hable con el provedor del Hosting de mi cliente y me dice q para q funcione es necesario que mi formulario de contacto sea autenticado con una cuenta de correo del mismo dominio via smtp, la verdad es q por mas tutoriales q hago no sucede esto. Hay algunos q corren pero a mi correo me llega el mail vacio. Por favor ayudenme…
Gracias
@Ikichpan
Si te aparece la pantalla en blanco y ningun mensaje probablemente tenes un error de PHP, eso sucede cuando no tenes habilitados los errores y falla el script, proba habilitarlos con:
errror_reporting(E_ALL);
Proba incluir algunos echo en distintas lineas para poder ir viendo hasta donde funciona y donde esta fallando.
Con respecto a la autenticacion, lo que necesitas es una cuenta de correo con usuario y contraseña, ya que smtp funciona asi, con un usuario y contraseña para autenticar que sos un usuario valido. Si tenes esos datos los pones en la configuracion que aparece en el articulo.
hola amigo tengo una duda con el codigo de php para envio de mail.
los estoy tratando de implementar en una forma de contacto pero ya llevo cmo tres dias tratando de que funcione y no me marca error en la parte del body, ya le cambio los valores porque mi formulario esta en español y ni asi agradeceria tu ayuda saludos
Hice lo que explicaste paso a paso y me manda este error puedes echarme la mano?
Warning: fsockopen() [function.fsockopen]: unable to connect to ssl://smtp.gmail.com:587 (Unable to find the socket transport “ssl” – did you forget to enable it when you configured PHP?) in C:\wamp\www\marmena\phpmailer\class.smtp.php on line 122
Warning: fsockopen() [function.fsockopen]: unable to connect to ssl://smtp.gmail.com:587 (Unable to find the socket transport “ssl” – did you forget to enable it when you configured PHP?) in C:\wamp\www\marmena\phpmailer\class.smtp.php on line 122
Error en el envio de mail
haaa mi codigo es este:
require(“phpmailer/class.phpmailer.php”);
$mail = new PHPMailer();
$mail->From = “micorreo@gmail.com”; // Mail de origen
$mail->FromName = “Yo”; // Nombre del que envia
$mail->AddAddress(“xxxx@hotmail.com”); // Mail destino, podemos agregar muchas direcciones
$mail->AddReplyTo(“micorreo@gmail.com”); // Mail de respuesta
$mail->WordWrap = 50; // Largo de las lineas
$mail->IsHTML(true); // Podemos incluir tags html
$mail->Subject = “Prueba”;
$mail->Body = “Ke onda solo aki probando esta cosa \n”.
“y viendo ke mas \n”.
“le pongo a este \n”.
“correo \n”;
//$mail->AltBody = strip_tags($mail->Body); // Este es el contenido alternativo sin html
$mail->Mailer = “smtp”;
$mail->Host = “ssl://smtp.gmail.com”;
$mail->Port = 587;
$mail->SMTPAuth = true;
$mail->Username = “miemail@gmail.com”; // SMTP username
$mail->Password = “mipass”; // SMTP password
$mail->Send();
if ($mail->Send())
echo “Enviado”;
else
echo “Error en el envio de mail”;
Cabe mencionar que el puerto lo cambie por uno que ya habia probado en c# y si me funciono, pero ahora que lo intento hacer con php no me funciona pense que era por que el puerto que tu tenias era incorrecto pero ni el que tu pones ni este que me sirvio en c# funciona… gracias otra vez, espero me ayudes
@Ivan
Te recomiendo que trates empezar con un ejemplo basico, sin el uso de ssl. Luego de que lo hagas funcionar enviando desde localhost vas agregando opciones.
@Manuel
Tienes que tener la posibilidad de abrir sockets desde tu php, no todas las instalaciones de php lo permiten. Puedes ver con phpinfo() para saber en detalle la configuracion de tu servidor.
El puerto para la conexion SSL es el 465.
Si si tengo habilitada esa opcion, uso WAMP server y en mi phpinfo() me despliega esto:
Registered Stream Socket Transports: tcp, udp
Hola utilize este tutorial para enviar correos automaticos cuando la persona utiliza el form de contacto al correr el script en mi localhost en un servidor wamp con php 4.0 corre perfectamente pero al subir el script a mi dominio gtautosport.net aparece este error Warning: fsockopen() [function.fsockopen]: unable to connect to mail.gtautosport.net:25 (Connection timed out) in /home/gtautosp/public_html/phpmailer/class.smtp.php on line 122 me puedes ayudar por favor? que sera configuracion del dominio o firewall?
Bueno antes que nada quiero excusarme por revivir temas pasados pero la verdad estoy desarrollando una pagina web y necesito que al momento de registrarse los usuarios se les envie un codigo de activacion de su cuenta….
He colocado el codigo que publicas en este post y no me funciona, me sale el mismo error…. de Manuel…
Warning: fsockopen() [function.fsockopen]: unable to connect to ssl://smtp.gmail.com:465 (Unable to find the socket transport “ssl” – did you forget to enable it when you configured PHP?)
No tienes habilitado en tu servidor para abrir sockets con PHP. Si estas trabajando en localhost debes buscar los modulos de PHP que tienes habilitados. Si es un servidor comprado tal vez este limitado… En lo personal los servidores como Godaddy y Powweb funcionan bien.
Saludos!