Ejemplo XAMPP: enviar un email en localhost

Icono XAMPP

Ejemplo que consiste en enviar un email en localhost con XAMPP, mediante la función mail() que trae PHP, muy útil a veces para cuando trabajamos con nuestro proyecto php en local, y queremos ver el correo electrónico que nos ha enviado el archivo php en cuestión.

 

 

Descripción del ejemplo

Para realizar este ejemplo necesitaremos configurar XAMPP correctamente y también necesitaremos un programa que actue de servidor de correo, llamado: Test Mail Server Tool.

Una vez configurado XAMPP, lo que conseguimos es que los correos salientes en localhost, se envién desde localhost, y que no usemos el servidor que trae XAMPP para recibir correos: mailtodisk ya que a mí me parece mucho mejor Test Mail Server.

 

Configurar XAMPP

Lo único que tenemos que hacer para configurar XAMPP sería:

 

  1. Abrimos PHP.INI
  2. En la sección [mail function], le quitamos el ; a la línea:
    
    ;SMTP = localhost
    

    y añadimos un ; para comentar la línea:

    
    sendmail_path = "C:\xampp\mailtodisk\mailtodisk.exe"
    

    …con lo que nos tiene que quedar el siguiente código:

    [mail function]
    ;XAMPP: Comment out this if you want to work with an SMTP Server like Mercury
    SMTP = localhost
    smtp_port = 25
    
    ; For Win32 only.
    ; http://php.net/sendmail-from
    sendmail_from = postmaster@localhost
    
    ; XAMPP IMPORTANT NOTE (1): If XAMPP is installed in a base directory with spaces (e.g. c:\program filesD:\xampp) fakemail and mailtodisk do not work correctly.
    ; XAMPP IMPORTANT NOTE (2): In this case please copy the sendmail or mailtodisk folder in your root folder (e.g. C:\sendmail) and use this for sendmail_path.  
     
    ; XAMPP: Comment out this if you want to work with fakemail for forwarding to your mailbox (sendmail.exe in the sendmail folder)
    ;sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"
    
    ; XAMPP: Comment out this if you want to work with mailToDisk, It writes all mails in the C:\xampp\mailoutput folder
    ; sendmail_path = "C:\xampp\mailtodisk\mailtodisk.exe"

     

 

Código PHP para enviar el email

El código para la función Mail() de php, sería el siguiente:

<?php
// El mensaje
$mensaje = "Esto es una prueba 1\r\nA ver si te llega correctamente 2\r\nUn saludo 3\r\n\n\n\nwww.ejemplocodigo.com";

// Si cualquier línea es más larga de 70 caracteres, se debería usar wordwrap()
$mensaje = wordwrap($mensaje, 70, "\r\n");

// Enviamos el email
mail('tu@direcciondeemail.com', 'Probando la funcion MAIL desde PHP', $mensaje);


echo "EMAIL ENVIADO...";

?>

 

Previsualización del ejemplo

Teniendo el Test Mail Server conectado, y supongamos que el archivo php de la función mail() se llamase “mail.php”, al poner en la barra del navegador http://localhost/mail.php nos debería de salir este email, si tenemos el Thunderbird:

 

Captura de imagen de un email

 

Si no tenemos Thunderbird instalado para que nos lo abra de forma predeterminada, pues en la carpeta que hayamos configurado en el Test Mail Server para recibir los emails, tendremos dicho email en formato .eml que podremos abrir con cualquier editor de texto.

 

 

Valoración General

[Valoraciones:  3    Promedio:  3.7 de 5]
  • Ignacio Espino

    me sale este mensaje…. Warning: 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:xampphtdocsmailmailier.php on line 9 y no me llega el mail

    • Javier Crego

      Hola Ignacio.

      Asegúrate de que el archivo php.ini, lo tienes como en el código de arriba del ejemplo.
      Es decir, tiene que tener descomentado (sin los puntos y comas) en la sección [mail function] el SMTP y el smtp_port:


      [mail function]
      SMTP = localhost
      smtp_port = 25

      Normalmente ese Warning es porque no le tienes bien configurado el puerto.

      • Ignacio Espino

        Gracias por el apoyo, ya resolvi ese detalle, ahora google me indica que bloqueo la cuenta porque una app esta intentanto acceder desde con mi cuenta …ya estan habilitadas las configuraciones de IMAP…de igual manera no podrías tener conocimiento de un servidor de correo para implementarlo en una intranet?

      • Javier Crego

        Servidores de correo para Windows, tienes varios:

        -hMailServer
        -Evo Mail Server
        -Microsoft Exchange Server
        -etc

        O por ejemplo el Mercury que viene ya con el XAMPP.

      • Marcos_tux

        Tengo el mismo problema, te paso parte de mi archivo php.ini

        [mail function]
        ; For Win32 only.
        ; http://php.net/smtp
        SMTP=localhost
        ; http://php.net/smtp-port
        smtp_port=25

        ; For Win32 only.
        ; http://php.net/sendmail-from
        ;sendmail_from = postmaster@localhost.com

        ; For Unix only. You may supply arguments as well (default: “sendmail -t -i”).
        ; http://php.net/sendmail-path
        ;sendmail_path = “C:xamppmailtodiskmailtodisk.exe”

        ; Force the addition of the specified parameters to be passed as extra parameters
        ; to the sendmail binary. These parameters will always replace the value of
        ; the 5th parameter to mail().
        ;mail.force_extra_parameters = “C:xamppmailtodiskmailtodisk.exe”

  • http://No%20tengo Gonzalo

    Hola, complemente una información que tenía con la tuya y me ha servido de maravilla.
    Pero tengo una cuestión y ojala que pudieran ayudarme.

    Estoy tratando de mandar un correo utilizando PHP y como servidor de correos Mercury/32 de XAMPP. Todo bien usando una cuenta para enviar el correo de GMAIL, pero lo que necesito es utilizar una cuenta interna y ahí es donde estoy atorado ya que he cambiado parámetros pero no me envía nada o me aparece algún error, me he regrasado a la configuración para utilizar la cuenta de GMAIL y ver si es posible que me puedan auxiliar, de antemano muchas gracias

    • Javier Crego

      Hola Gonzalo.

      ¿A qué te refieres con cuenta interna?. ¿Podrías detallar un poco mejor el proceso de configuración del Mercury, con esa cuenta interna?

      • http://no%20tengo Gonzalo

        Claro, una disculpa si es que no me explique lo suficientemente claro.

        Ya tengo configurado el Mercury y el PHP para que mande un correo a cualquier cuenta, pero esto lo hace utilizando en la parte de MercuryC SMTP Cliente una cuenta de correo electrónico de GMAIL (ejemplo@gmail.com). Lo que necesito es que esta cuenta en lugar de ser de GMAIL sea de un correo institucional (ejemplo@institucion.gob.es). Además no sé si tengo que cambiar mas parámetros en el php.ini 🙁

      • http://no%20tengo Gonzalo

        Solo cambie los datos utilizados para MercuryC SMTP Cliente, pero aún así no hace nada (no me envía el correo), ¿que crees que deba hacer, o a que se deba?, si estoy utilizando el puerto indicado para ello, así como el nombre del host y tipo de conexión y usuario con contraseña validos.

      • Javier Crego

        Gonzalo, viste el video que te puse y seguiste todos los pasos que hacen en él?, ¿También los del php.ini?

        Si hiciste todo como en el video, y tienes los datos bien, entonces puede que a que la configuración del servidor del correo institucional, no admite conexiones via localhost.

        Con correos institucionales suele dar más problemas, que con correos genéricos como lo es GMAIL, ya que usan mejores herramientas para evitar el spam.

      • Gonzalo

        Disculpa otra pregunta 🙂

        Cuando quiero mandar un mensaje de prueba directamente desde el mercury

        File

        Send a mail message

        -Quisiera cambiar el From: “E-Mail Administrator” postmaster@localhost

        que aparece en automático por una cuenta de correo en específico
        Ejemplo
        From:ejemplo@institucion.gob.es
        pero igual que aparezca en automático sin tener que poner el cursos, borrar e ingresar manualmete

      • Javier Crego

        Me temo que eso va a ser imposible que lo puedas cambiar, ya que eso viene por defecto en el ejecutable del Mercury.

        Si quieres cambiar los headers, y ponerlos automáticos, tendrías que probar con otro cliente, o crear una página php para enviar los correos, donde puedes ponerle los headers configurados como tu desees:


        $para = 'nobody@example.com';
        $titulo = 'El título';
        $mensaje = 'Hola';
        $cabeceras = 'From: webmaster@example.com' . "rn" .
        'Reply-To: webmaster@example.com' . "rn" .
        'X-Mailer: PHP/' . phpversion();

        mail($para, $titulo, $mensaje, $cabeceras);

    • Javier Crego

      Hola de nuevo Gonzalo.

      Prueba a seguir lo que hacen en este video:

      https://www.youtube.com/watch?v=rcWS1uuf304

      pero tendrás que realizarlo con la configuración de smtp, puerto, y seguridad de tu correo institucional, que no será la misma que los de GMAIL, y dependiendo de cada caso, pues como no lo configures bien en el cliente, con los datos exactos del servidor de correo saliente SMTP de ese correo institucional, pues no te va a funcionar bien.

  • jose

    buenas me sale todo lo que tu dices pero a la hora de revisar el corro no me a llegado nada alguna solucion te lo agradeceria

    • Javier Crego

      ¿Dónde revisas el correo?
      ¿Has revisado que se te haya generado el archivo .eml en la carpeta para recibir los correos dentro de la configuración del Test Mail Server?

  • https://zarza.com/localhost-no-hay-lugar-como-127-0-0-1/ Laura

    Realmente oportuno! Muchas gracias por toda la información. Como aporte quisiera dejarles este artículo https://zarza.com/localhost-no-hay-lugar-como-127-0-0-1/ el cual me sirvió de mucho para entender un poco más sobre el tema, espero les sea de utilidad a sus seguidores.
    Gracias!