Envío de mails desde PHP con smtp, autenticacion, ssl y otros.

Posted: Julio 28th, 2008 | Author: admin | Filed under: PHP, Recursos Web | Tags: , , , , , | 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”;


22 Comments on “Envío de mails desde PHP con smtp, autenticacion, ssl y otros.”

  1. 1 Darnux said at 3:01 am on Enero 28th, 2009:

    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

  2. 2 temoc said at 12:58 pm on Enero 30th, 2009:

    y como se envia el mail?, a lo mejor es una pregunta tonta pero creo que no se menciona nunca

  3. 3 admin said at 11:33 am on Enero 31st, 2009:

    Tienes toda la razon, agregada la linea de envio =)

  4. 4 Xavier said at 11:50 pm on Febrero 6th, 2009:

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

  5. 5 admin said at 10:48 am on Febrero 7th, 2009:

    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.

  6. 6 mario aceves davalos said at 11:06 am on Marzo 3rd, 2009:

    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

  7. 7 admin said at 7:41 pm on Marzo 9th, 2009:

    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.

  8. 8 Claudio said at 1:28 am on Marzo 16th, 2009:

    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.

  9. 9 GIOVANNI said at 2:49 pm on Marzo 22nd, 2009:

    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

  10. 10 hectormbaez said at 1:13 pm on Marzo 27th, 2009:

    gracias el error 530 de autenficacion me estaba dejando loco!!!!!!!!!!!!!!

  11. 11 Ikichpan said at 1:14 am on Abril 15th, 2009:

    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

  12. 12 admin said at 9:35 am on Abril 15th, 2009:

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

  13. 13 ivan said at 10:09 am on Mayo 6th, 2009:

    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

  14. 14 Manuel said at 2:00 am on Mayo 7th, 2009:

    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

  15. 15 Manuel said at 2:03 am on Mayo 7th, 2009:

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

  16. 16 Manuel said at 2:06 am on Mayo 7th, 2009:

    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

  17. 17 admin said at 9:47 am on Mayo 7th, 2009:

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

  18. 18 admin said at 9:48 am on Mayo 7th, 2009:

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

  19. 19 Manuel said at 10:50 am on Mayo 7th, 2009:

    Si si tengo habilitada esa opcion, uso WAMP server y en mi phpinfo() me despliega esto:
    Registered Stream Socket Transports: tcp, udp

  20. 20 Giovanny Medaglia said at 3:33 am on Noviembre 11th, 2009:

    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?

  21. 21 Cristhian said at 1:49 pm on Febrero 10th, 2010:

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

  22. 22 admin said at 7:27 pm on Marzo 19th, 2010:

    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!


Leave a Reply