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.

Nos comenta danipelon que la versión oficial del proyecto está ahora en GitHub, esta es la dirección.

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, además de desarrollar software y mantener sistemas en el CSIC, hace poco he fundado junto con Alberto Hornero una start-up: CODECTION donde trabajamos con software libre. 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

  • danipelon

    Un par de apuntes:

    - Si se usa el código del ejemplo con “copiar y pegar” hay que tener la precaución de sustituir las comillas (tanto las simples como las dobles) por las correspondientes para que funcione.

    - La versión oficial de PHPMailer está alojada en Github, no en sourceforge:

    https://github.com/Synchro/PHPMailer

    (danipelon)

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

    Gracias por tu comentario he actualizado el contenido para que diga lo de GitHub (no lo sabía).

    Y gracias también por el otro apunte, siempre viene bien clarificar más.

  • marcos

    Hola!! Te comento trabajo en una Universidad y diseñé una Page, definí un Formulario de Consultas del Docente. El docente hace la solicitud le llega a un operador y este le reponde, ahora este operador quiere que cuando le llegue a El la solicitud le vaya también una copia a su Ayudante es decir otro mail. Esto se puede hacer? Me podrias ayudar te lo agraedcería. Te paso como tengo conf. el PHP:

    <?php

    if(isset($_POST['email']))
    {

    // Debes editar las próximas dos líneas de código de acuerdo con tus preferencias
    $email_to = "CORREOOPERADOR@SERVIDOR";
    $email_subject = "** Reserva Proyectores Docentes **";

    // Aquí se deberían validar los datos ingresados por el usuario
    if(!isset($_POST['first_name']) ||
    !isset($_POST['last_name']) ||
    !isset($_POST['aula']) ||
    !isset($_POST['dia']) ||
    !isset($_POST['horario']) ||
    !isset($_POST['carrera']) ||
    !isset($_POST['email']) ||
    !isset($_POST['telephone']) ||
    !isset($_POST['comments'])) {

    echo "Ocurrió un error y el formulario no ha sido enviado. “;
    echo “Por favor, vuelva atrás y verifique la información ingresada”;
    die();
    }

    $email_message = “Detalles del formulario de contacto:nn”;
    $email_message .= “Docente: ” . $_POST['first_name'] . “n”;
    $email_message .= “Elemento: ” . $_POST['last_name'] . “n”;
    $email_message .= “Aula: ” . $_POST['aula'] . “n”;
    $email_message .= “Día: ” . $_POST['dia'] . “n”;
    $email_message .= “Horario: ” . $_POST['horario'] . “n”;
    $email_message .= “Carrera: ” . $_POST['carrera'] . “n”;
    $email_message .= “E-mail: ” . $_POST['email'] . “n”;
    $email_message .= “Teléfono: ” . $_POST['telephone'] . “n”;
    $email_message .= “Mensaje: ” . $_POST['comments'] . “nn”;

    // Ahora se envía el e-mail usando la función mail() de PHP
    $headers = ‘From: ‘.$email_from.”rn”.
    ‘Reply-To: ‘.$email_from.”rn” .
    ‘X-Mailer: PHP/’ . phpversion();
    @mail($email_to, $email_subject, $email_message, $headers);

    echo “¡El formulario se ha enviado con éxito!”;

    }
    ?>
    –Inicio–