Enviar correo usando un servidor SMTP con PHP

Dentro de las funcionalidades básicas de cualquier aplicación web se encuentra la comunicación con el usuario a través de correo electrónico. Tenemos la opción fácil y directa de usar la función mail() de PHP que usa un demonio de SMTP propio (suele ser sendmail), sin embargo, los filtros de spam harán su labor y aunque seamos confiables, tenemos todas las papeletas para que nos tachen de los contrario y el correo no llegará a su destino.

Enviar correo usando servidor SMTP con PHP

La solución es usar un servidor SMTP externo, aquí mismo explicamos cómo hacer uso del servidor SMTP de Gmail para usarlo dentro de WordPress, pero vamos a explicaros un método válido para cualquier aplicación que desarrolléis con PHP.

Lo primero que tenemos que hacer es descargar la clase que se encargará del trabajo, es software libre bajo licencia GPL, hablamos del proyecto PHPMailer. Descargamos la última versión disponible para nuestra versión de PHP (aquí hablaremos de la versión más actual, la que corresponde con PHP 5) y descomprimimos.

La clase tiene otras funcionalidades, pero nosotros como sólo vamos a enviar correo, usaremos el código de los ficheros:

  • class.phpmailer.php
  • class.smtp.php

El procedimiento es el siguiente: incluimos los ficheros en cuestión, instanciamos un objeto, asignamos sus atributos (asunto, remitente, destinatario, cuerpo del mensaje) y finalmente ejecutamos un método que lo envía.

Veamos un ejemplo completo:

require(‘class.phpmailer.php’);
require(‘class.smtp.php’);

$mail = new PHPMailer();

$body = “Cuerpo del mensaje”;

$mail->IsSMTP(); 

// la dirección del servidor, p. ej.: smtp.servidor.com
$mail->Host = “direccion_servidor”;

// dirección remitente, p. ej.: no-responder@miempresa.com
$mail->From = “Dirección_remitente”;

// nombre remitente, p. ej.: "Servicio de envío automático"
$mail->FromName = “Nombre_remitente”;

// asunto y cuerpo alternativo del mensaje
$mail->Subject = “Asunto”;
$mail->AltBody = “Cuerpo alternativo 
    para cuando el visor no puede leer HTML en el cuerpo”; 

// si el cuerpo del mensaje es HTML
$mail->MsgHTML($body);

// podemos hacer varios AddAdress
$mail->AddAddress(“dirección_destino”, “Nombre_destino”);

// si el SMTP necesita autenticación
$mail->SMTPAuth = true;

// credenciales usuario
$mail->Username = “Usuario”;
$mail->Password = “Contraseña”; 

if(!$mail->Send()) {
echo “Error enviando: ” . $mail->ErrorInfo;
} else {
echo “¡¡Enviado!!”;
}

Author Description

F. Javier Carazo Gil

Casi Ingeniero Informático, co-fundador y administrador de Linux Hispano, co-fundador de Red de Autores y Geometrio, puedes saber más sobre mí, mi vida laboral, mis libros, mis artículos y mi día a día en @fjcarazo y en mi perfil público de LinkedIn.

  • Pingback: Bitacoras.com

  • Sergio

    Aquí tienes otra API para enviar correos con PHP y, para mi gusto, mucho más potente.
    http://swiftmailer.org/

  • http://www.jcarazo.com F. Javier Carazo Gil

    @Sergio: Gracias por el enlace, no conocía esa API y parece mucho más profesional por lo que veo. La tendré en cuenta a partir de ahora.

  • http://emslinux.com/ David Gómez (@emsLinux)

    Deberías explicar mejor como integrarlo en un blog con WordPress.

    No se si es el sueño que tengo, pero no logro entenderlo.

  • http://www.jcarazo.com F. Javier Carazo Gil

    @emslinux: Para integrarlo en WordPress puedes usar estos dos plugins:
    * El explicado en este post para usar Gmail o Google Apps
    * WP Mail SMTP, para cualquiera

  • http://www.geniutrixone.tk geniutrixone

    Hola,

    En mi blog tengo un par de publicaciones en las que se explica como agregar un formulario de contacto a wordpress y como configurar wordpress para enviar correos utilizando gmail como smtp server.

    Si integran las 2 cosas pueden enviar correos sin problemas, he probado los métodos en varios sitios web que he realizado y nunca me han presentado problemas.

    http://geniutrixone.wordpress.com/category/cms/wordpress/

    Saludos.

  • Maximin31

    Grande maestro, he buscado por todas partes y al fín pude enviar un mail gracias a tu post. te mereces un 100%. Saludos

  • Denis Orlando Portillo Anzoate

    Buenisimo !

  • Dkskywalker28

    a mi me da error al autenticar, Could not authenticate…. aun poniendolo a true

  • Dkskywalker28

    ya si, hay que añadir estas tres lineas para enviarlo desde gmail
    $mail->Mailer = ‘smtp’; $mail->Host = ‘ssl://smtp.gmail.com’; $mail->Port = 465;

    ahora m salta un error de conexion… ju

  • http://www.linuxhispano.net/ F. Javier Carazo Gil

    Prueba con esto a ver qué tal:
     $mail->SMTPAuth   = true;                  // Habilita la autenticación SMTP  $mail->SMTPSecure = “ssl”;                 // Establece el tipo de seguridad SMTP  $mail->Host       = “smtp.gmail.com”;      // Establece Gmail como el servidor SMTP  $mail->Port       = 465;                   // Establece el puerto del servidor SMTP de Gmail

  • Juan Ramón

    Muchas gracias por la información. Comentar que para descargar PHPMAiILER ahora tenemos que ir a: http://code.google.com/a/apache-extras.org/p/phpmailer/

  • zatu

    ¿Esto funciona para enviar correos usando solo cuentas de gmail o podemos usar cuentas de correo tipo nombre@dominio.com?

  • Raul IONESCU
  • deivis crisanto

    Hola estoy usando phpmailer con Exchenge en la configuracion estoy usando

    $smtp=podxxxxx.outlook.com
    puerto 587;
    SMTPSecure=”TLS”; mi archivo ejemplo es de la siguiente manera:

    IsSMTP();
    $mail->Host =”podxxxxx.outlook.com”;
    $mail->Port = 587;
    $mail->SMTPSecure=”TLS”;
    $mail->From =”deivis.crisanto@unas.edu.pe”;
    $mail->FromName =”Deivis”;
    $mail->Subject =”test”;
    $mail->AltBody =”test-envio correo.”;
    $mail->MsgHTML($body);
    $mail->AddAddress(“deivis.crisanto@unas.edu.pe”, “luis Crisanto”);
    $mail->SMTPAuth = true;
    $mail->Username =”deivis.crisanto@unas.edu.pe”;
    $mail->Password =”contraseña”;
    if(!$mail->Send()) {
    echo “Error enviando: ” .$mail->ErrorInfo;
    } else {
    echo “enviado!!”;
    }
    ?>

    al momento de correr el ejemplo me sale el siguiente error:

    Error enviando: The following From address failed: deivis.crisanto@unas.edu.pe : MAIL not accepted from server,530,5.7.1 Client was not authenticated
    SMTP server error: 5.7.1 Client was not authenticated
    SMTP server error: 5.7.1 Client was not authenticated

    por favor ayuda para poder solucionar el problema.

  • http://www.linuxhispano.net/ F. Javier Carazo Gil

    Buenas, todo parece indicar que hay un problema con la autenticación, revisa tu contraseña y tu nombre de usuario, a ver si es que en ese servidor no hace falta pasar el @dominio o algo así.

  • deivis crisanto

    Buenas tardes y gracias por la pronta respuesta.
    Tengo otra duda , cuando trabajo con un correo Gmail configurando el smtp al enviar un correo a gmail me funciona ok. pero cuando quiero enviar a un correo de hotmail o yahoo me sale el error:

    Error enviando: SMTP Error: The following recipients failed: usuario@hotmail.com

    SMTP server error: 5.1.1 The email account that you tried to reach does not exist. Please try 550-5.1.1 double-checking the recipient’s email address for typos or 550-5.1.1 unnecessary spaces. Learn more at 550 5.1.1 http://support.google.com/mail/bin/answer.py?answer=6596 s38si2768527yhp.64 – gsmtp

    //la linea de para en mi ejemplo.php ojo:solo cambio esta el destinatario puesto que para un correo a gmail me envía exitosamente.
    $mail->AddAddress(‘deivis.crisanto@unas.edu.pe’, ‘LUIS’);

    quisiera saber si esta si con el php mailer puedo enviar correos a otros dominios como por ejemplo yahoo.com, hotmail.com o midominio.com , desde un gmail gracias.

  • http://www.linuxhispano.net/ F. Javier Carazo Gil

    deivis crisanto cuando te conectas por SMTP a un servicio, puedes enviar a cualquier dominio independientemente de si es yahoo.com, hotmail.com o midominio.com. Deberías poder hacerlo sin problema.

    Pon las líneas en las que indicas remitente, porque en $mail->AddAddress(‘deivis.crisanto@unas.edu.pe’, ‘LUIS’); no veo problema, ¿hay algo diferente?

  • deivis crisanto

    Gracias francisco por tu respuesta ya logre que me funcione el script, pero me funciona con un correo en terra.com es extraño que no me funcione con gmail o mi correo institucional seguiré investigando gracias.

    Saludos.

  • http://www.linuxhispano.net/ F. Javier Carazo Gil

    ¿Quizás una restricción de tu servidor? Podrías preguntar a ver si te dan una respuesta.

  • http://www.linuxhispano.net/ F. Javier Carazo Gil

    Si no, mira también estas soluciones: http://freecode.com/projects/smtp4php que apunta aquí abajo a ver si así, si hay suerte.

  • Eduardo

    Muchas gracias!

  • David Rodriguez

    Muchas gracias Javier. LLevaba un tiempo con un problema con gmail y me lo ha solucionado. Un saludo