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

Posted: julio 28th, 2008 | Author: | Filed under: PHP, Recursos Web | Tags: , , , , , | 46 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»;


46 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!

  23. 23 luis said at 2:52 pm on julio 15th, 2010:
  24. 24 bernardo said at 1:17 pm on agosto 5th, 2010:

    Miren no me funciona para nada el codigo, me manda el siguiente error: SMTP Error: Could not connect to SMTP host. SMTP Error: Could not connect to SMTP host. Error en el envio de mail

    ademas no explican como configurar el php.ini

  25. 25 David said at 3:43 am on noviembre 2nd, 2010:

    Hola, estoy tratando de hacer un formulario de contacto con AS3 y php. La parte de AS3 me funciona, pero el php sólo he conseguido que funcione desde el servidor local. Cuando lo subo al servidor contratado no me funciona ya que requiere autentificación, llevo una semana leyendo post de este tipo y dado que no sé nada de php no he avanzado nada tampoco.

    Les dejo el código por si me pueden ayudar, empiezo a estar un poco frustrado.

    From = $hillpart@hillpart.com; // Mail de origen
    $mail->FromName = $Formulario; // Nombre del que envia
    $mail->AddAddress($design@hillpart.com); // Mail destino, podemos agregar muchas direcciones
    $mail->AddReplyTo($hillpart@hillpart.com); // Mail de respuesta

    $mail->WordWrap = 50; // Largo de las lineas
    $mail->IsHTML(true); // Podemos incluir tags html
    $mail->Subject = “Prueba”;
    $mail->Body = «Nombre: » . $HTTP_POST_VARS[«nombre»] . «\n»
    . «Email: » . $HTTP_POST_VARS[«email»] . «\n»
    . «telefono: » . $HTTP_POST_VARS[«telefono»] . «\n»
    . «asunto: » . $HTTP_POST_VARS[«asunto»] . «\n»
    . «Mensaje: » . $HTTP_POST_VARS[«mensaje»];

    //$mail->AltBody = strip_tags($mail->Body); // Este es el contenido alternativo sin html

    $mail->Mailer = “smtp”;
    $mail->Host = “ssl://smtp.hillpart.com”;
    $mail->Port = 25;
    $mail->SMTPAuth = true;
    $mail->Username = “hillpart@hillpart.com”; // SMTP username
    $mail->Password = “fr3dr1k”; // SMTP password
    $mail->Send();
    if ($mail->Send())
    echo “Enviado”;
    else
    echo “Error en el envio de mail”;

    ?>

  26. 26 joseph muentes said at 10:03 pm on diciembre 26th, 2010:

    hola amigo a mi me sale el siguiente error SMTP Error: Could not connect to SMTP host. SMTP Error: Could not connect to SMTP host. Error en el envio de mail

    que me faltara para que lo envie gracias..

  27. 27 Juankiz said at 2:43 pm on febrero 11th, 2011:

    Muy bien el foro… los felicito… Han sido de mucha ayuda… =)

  28. 28 CAROLINA said at 6:26 pm on febrero 24th, 2011:

    MIL GRACIAS, DE VERDAD ME SIRVIO MUCHISIMO TU AYUDA

  29. 29 Marco said at 12:01 am on febrero 25th, 2011:

    Muy bueno, me sacaron de apuros, solo que a la hora de enviar me llegan dos copias, ¿como lo puedo controlar para que llegue solo una?

    GRACIAS POR EL APORTE
    EXCELENTE

  30. 30 Diego Roldán said at 9:05 am on junio 25th, 2011:

    buenas, espero que me puedan responder, estoy con el mismo problema de autentificación. Pero es un swf de flash que se conecta con el php para el envio de mensajes. el problema es que no tengo idea como modificar el código para que se autentifique…
    este es el codigo que tengo en el php:

    $valor)
    {
    $cuerpo .= «$key: $valor \n»;
    }

    if (mail(«$destino»,»Mensaje desde el website»,$cuerpo,»From: xxxxxxx@gmail.com«)) echo «OK»; else echo «KO»;
    ?>

    y el formulario es este que esta alojado en
    http://www.kernet.com.ar/ubicacion.html

    mi mail de contacto es diegojoaquin01@gmail.com

    Muchas gracias

  31. 31 leo said at 8:15 pm on mayo 10th, 2012:

    que version del phpmailer debo de utilizar.

    tengo apache 2.064
    y php 4.4.9

  32. 32 Jose Manuel said at 1:28 pm on agosto 28th, 2012:

    Nose porque no me funciona y me estoy volviendo loco, me podeis ayudar porfis??
    Host = ‘localhost’;

    //Variables que recogen desde la página del formulario
    $cuerpo = «Formulario enviado\n»;
    $cuerpo .= «Nombre y Apellidos: » . $HTTP_POST_VARS[«nombreYapellidos»] . «\n»;
    $cuerpo .= «Email: » . $HTTP_POST_VARS[«email»] . «\n»;
    $cuerpo .= «Sugerencia: » . $HTTP_POST_VARS[«sugerencia»] . «\n»;

    //enviamos los datos por emial
    $mail(«avanzaconpimile@hotmail.com»,»Formulario recibido»,$cuerpo);
    $mail->Send();

    //damos las gracias al usuario
    echo «Su mensaje ha sido enviado
    correctamente.
    Gracias por su confianza»;
    header(«Refresh: 2; URL=http://www.avanzaconpimile.es/»);

    ?>

  33. 33 yo_SMSCUBA said at 1:59 am on octubre 6th, 2012:

    muy bueno, estoy intentando enviar un email que incluya una imagen dentro del cuepo no en adjuto sino que la imagen salga en el cuerpo del mensaje

  34. 34 Carlos said at 12:26 pm on noviembre 20th, 2012:

    Excelente post, me quedó una duda, si adjunto una imagen, como hago para que se vea en el cuerpo del mail? hice lo siguiente,

    $mail->Body = ‘\n’;
    $mail->AddAttachment(’01.JPG’);

    Me llega el adjunto pero no veo la imagen en el cuerpo.

  35. 35 buenas said at 1:09 am on noviembre 28th, 2012:

    hola amigos estoy usando el appserv y no funciona el envio de correos me ayudan gracias

  36. 36 Cristobal Alcayaga said at 5:19 pm on diciembre 2nd, 2012:

    Gracias por la explicación, me ayudo mucho.

  37. 37 ManuelBeat said at 7:35 pm on febrero 18th, 2013:

    Para los que que quieran habilitar el socket transport SSL en WAMP. Esta es la solucion:

    1. En primer lugar detener el servicio Apache
    2. Encontrar libeay32.dll y ssleay32.dll en carpeta xampp \ php \, y copiarlo en xampp \ apache \ carpeta \ bin. Sólo sobrescribir los archivos antiguos de allí.
    3. Editar el archivo php.ini en xampp \ apache \ bin, quite el punto y coma «; extension = php_openssl.dll»
    4. Inicie el servicio de Apache

    Eso es todo, tu SSL transport socket en XAMPP se ha activado. Espero que haya sido de ayuda ya que tambien tuve el mismo problema y asi le solucione. 🙂

  38. 38 fedegara said at 6:28 am on marzo 21st, 2013:

    Muchas gracias por el ejemplo funciona a la perfección y me vino bárbaro altamente recomendable el tutorial

  39. 39 Envío de mails desde #PHP con smtp, autenticacion, ssl y otros con #phpmailer by wanderingbit.com | www.coudlain.com said at 2:12 pm on mayo 6th, 2013:

    […] Fuente: wanderingbit.com […]

  40. 40 zxxbasicULIS said at 6:47 pm on mayo 15th, 2013:

    se puede tambien enviar correo usando sendmail de xammp solo se configura igual pueto y smtp etc es facil.

  41. 41 raul said at 7:14 pm on mayo 17th, 2013:

    el smtp de gmail la utentificacion debe ser usando tls no ssl por eso no llegan

  42. 42 Jose Vicente said at 9:12 am on agosto 15th, 2013:

    Hola amigos, funciona muy bien lo malo es que luego de enviar el correo me da el siguiente error. y no encuentro como solucionarlo.

    Warning: date() [function.date]: It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier.

  43. 43 Sales said at 12:14 pm on diciembre 19th, 2013:

    Buenas para todos.
    Tengo esta función para enviar correos.
    public static function send_mail( $from, $to, $subject, $body ) {
    $headers = »;
    $headers .= «MIME-Version: 1.0\n»;
    $headers .= ‘Content-type: text/html; charset=utf-8’ . «\r\n»;
    $headers .= «From: $from\n»;
    $headers .= «Reply-To: $from\n» .
    ‘X-Mailer: PHP/’ . phpversion();

    mail( $to, $subject , $body, $headers );

    }

    La función me funciona perfectamente, lo unico que tengo una duda, porque cuando se envia un correo hacia una persona con correo en gmail, donde dice quien envio el correo sale quien envio el correo y dice : a través de box909.bluehost.com.

    Es decir quedaria de la siguiente forma.
    noreply@prueba.com a través de box909.bluehost.com
    donde noreply@prueba.com seria el correo que envia.
    Gracias de antemano. Saludos para todos.

  44. 44 Sales said at 12:20 pm on diciembre 19th, 2013:

    En la pregunta anterior lo que quiero es que en el correo solo aparezca quien envio el correo que seria noreply@prueba.com sin esta parte noreply@prueba.com
    Saludos

  45. 45 Sales said at 12:32 pm on diciembre 19th, 2013:

    Es sin esta parte a través de box909.bluehost.com
    Disculpen la molestia.

  46. 46 Sales said at 1:43 pm on diciembre 19th, 2013:

    Buenas para todos ya encontre la solución, la dejo aqui para si a alguien le hace falta que sepa como arreglarlo.

    Usted debe modificar la linea sendmail_path localizada en su php.ini. Deberia quedarle de la siguiente forma.
    sendmail_path = /usr/sbin/sendmail -t -i -f’user@domain.com’

    Saludos para todos