Banner

Ultima revisión 04/12/2012

Clase PHPMailer para el envío de correos a traves de SMTP

Hace unos días un amigo mío me pregunto a cerca de la correcta instalación del PHPMailer en los servicios de Hosting y, concretamente, para el de 1and1. Hoy os voy a explicar cómo instalar el PHPMailer para que funcione, prácticamente, en todos los Hosting y contenplando los casos general, de 1and1, Gmail y Hotmail.

¿ Qué es PHPMailer ?

PHPMailer es una clase php para enviar emails basada en el componente active server ASPMail. Permite de una forma sencilla tareas complejas como enviar archivos adjuntos, correos en formato HTML, acceder a Gmail, etc. Pddemos enviar emails via SendMail, PHP mail(), o con SMTP, aunque, lo recomendable es hacerlo via SMTP porque, entre otras cosas, permite múltiples destinatarios y múltiples servidores.

Instalación

Lo primero que debemos hacer es descargar la clase:

  • class.phpmailer.php: Es la clase PHPMailer propiamente dicha.
  • phpmailer.lang-es: Es la traducción al español que debe de estar en un subdirectorio dependiente de PHPMailer llamado language.
  • class.pop3.php: Es la que permite la recepción de emails a través de un servidor smtp.
  • class.smtp.php: Es la que permite el envío de emails a través de un servidor smtp.

Podéis descargar el fichero class.phpmailer.zip dónde están comprimidos todos los archivos.

Una vez hayáis descargado en vuestro disco, para instanciar desde nuestra página PHP a la clase PHPMailer, debemos insertar el siguiente código al principio del archivo.

require_once("phpmailer/class.phpmailer.php");
$mail = new PHPMailer();

Configuración General

Una vez instanciado el objeto de la clase PHPMailer será necesario configurarlo pero antes, explicaremos sus propiedades y métodos principales.

NombreDescripción
AltBody Establece el cuerpo del mensaje como sólo de texto
Body Establece el cuerpo del mensaje. Puede ser texto plano o formato HTML. Si es formato del email que vamos a enviar es HTML, habrá que establecer el método IsHTML() a TRUE.
ConfirmReadingTo Establece el email al que se enviará la Confirmación de que ha sido leido por el destinatario.
ErrorInfo Informa del error más reciente producido al intentar enviar un email.
From Establece la dirección de email de origen del Mensaje, es decir, la dirección del emisor. Por defecto es root@localhost.
FromName Establece el nombre de quien envía el mensaje. El nombre del emisor. Por defecto es root user
Host Establece el servidor SMTP. Se puede poner varios, siempre, separándolos por punto y coma. Por defecto es localhost.
Mailer Establece el método para enviar el mensaje puede ser mail, SendMail o SMTP. Por defecto es mail
Password Establece la contraseña del email.
PluginDir Establece el directorio donde están incluidos los plugins de phpmailer. Es útil si los archivos de la clase están separados entre directorios distintos.
Port Establece el puerto por defecto del servidor SMTP. Por defecto es el 25 pero para Gmail es el 995
ReplyTo Establece todas las direcciones Reply-To. Por defecto es array().
SMTPAuth Establece la autentificación SMTP. Por defecto es false.
Subject Establece el asunto del mensaje. Es obligatorio.
Timeout Establece el timeout del servidor STMP en segundos y si se pasa del tiempo fijado provoca error. Por defecto es 10.
Username Establece el nombre de usuario SMTP. Es obligatorio.
WordWrap Establece el word Wrapping del cuerpo de un mensaje a un número determinado de caracteres. Por defecto es 0, es decir, sin límite.

NombreDescripción
AddAddress ($address, $name) Añade una dirección de destino del mensaje. El parámetro $name es opcional
AddAttachment ($path, $name,
[$encoding = "base64"],
[$type = "application/octet-stream"])
Añade un fichero adjunto al mensaje.
Retorna false si el fichero no pudo ser encontrado.
$path, es la ruta del archivo puede ser relativa al script php (no a la clase PHPMailer) o una ruta absoluta. Se aconseja usar rutas relativas
$name, nombre del fichero
$encoding, tipo de codificación. Se aconseja dejar la predeterminada
$type, el valor por defecto funciona con cualquier clase de archivo. Se puede usar un tipo específico como por ejemplo image/jpeg
AddBCC ($address, $name) Añade una dirección BCC.
AddCC ($address, $name) Añade una dirección CC
AddReplyTo ($address, $name) Añade una dirección Reply-To
ClearAddresses () Borra todas las direcciones de destino establecidas anteriormente
ClearAttachments () Borra todos los ficheros adjuntos establecidos anteriormente
IsHTML ($bool) Establece el tipo de mensaje a HTML
Send () Envía el mensaje, devuelve false si ha habido algún problema. Consultando la propiedad ErrorInfo se puede saber cuál ha sido el problema

Ahora definimos las variables comunes:

$dominio    = "ejemplo.com"; // sin http://www
$name        = "Administrador"; // También puede ser un campo del formulario como asunto o mensaje.
$user        = "info";
$password    = "eJemplo2012.";
$SPLangDir    = "phpmailer/language/";
$subject    = $_POST['asunto']; // También puede ser $_GET
$message    = $_POST['mensaje'];// También puede ser $_GET

$htmlFormat    = true;

Ahora sólo nos resta insertar el código:

try {
    $mail->SetLanguage("es", $SPLangDir);
    $mail->FromName = utf8_decode($name); 
    $mail->IsSMTP();
    $mail->SMTPAuth = true;

    $mail->Host = "mail.".$dominio; // SMTP a utilizar. Por ej. mail.elserver.com ó smtp.gmail.com
    $mail->Username = $user."@".$dominio; // Correo completo a utilizar
    $mail->Password = $password; // Contraseña del correo
    $mail->Port = 25; // Puerto a utilizar, normalmente es el 25
    $mail->From = "domain@".$dominio; // Desde donde enviamos (Es información para mostrar)

    $mail->AddAddress($user."@".$dominio); // Esta es la dirección a donde enviamos.
    $mail->AddReplyTo($user."@".$dominio, $name); // A que dirección se puede responder el correo.
    $mail->IsHTML($htmlFormat); // El correo se envía como HTML
    $mail->Subject = $subject; // Este es el titulo del email. Vamos el asunto.
    $body = utf8_decode($message); // El utf8_decode puede no ser necesario.
    $mail->Body = $body; // Mensaje a enviar. Yo aquí uso la plantilla que te comentaba.
    $mail->AltBody =  $message; // Texto sin html. Yo aquí uso la plantilla que te comentaba.

    // Si tenemos que enviar archivos adjuntos.
    $mail->AddAttachment("img/logo.png", "logo.png");
    $mail->AddAttachment("img/twitter.png", "twitter.png");
    $mail->AddAttachment("img/facebook.png", "facebook.png");
    
    if($mail->Send()){ // Envía el correo.
        $result .= "<b class='green'>El correo fue enviado correctamente.</b>";
        echo $result;
    }else{
        error_log($mail->ErrorInfo, 0);
        $result .= "<b class='red'>Hubo un inconveniente.</b><br />".$mail->ErrorInfo."Por favor, inténtalo más tarde.<br /><br />Recuerde que puede ponerse en contacto con nosotros por teléfono o directamente por correo electrónico.<br />Perdonen por las molestias causadas.";
        echo $result;
    }
} catch (phpmailerException $e) {
    // Si hubo un error en PHPMailer
    $result .= "<b class='red'>Hubo un inconveniente.</b><br />".$e->errorMessage()."</b>";
    echo $result;
} catch (Exception $e) {
    // Si hubo otro tipo de error.
    $result .= "<b class='red'>Hubo un inconveniente.</b><br />".$e->getMessage()."</b>";
    echo $result;
}

Normalmente el proceso de instalación residirá en cambiar las variables de arriba y no hará falta tocar el código pero, por si acaso, os comento a alguna de las configuracione especiales que he visto.

Configuración de 1and1

En alguna ocasión he visto el error:

Warning: fsockopen() [function.fsockopen]: unable to connect to smtp.1and1.es:25 (Connection refused) in (…) on line 100
Language string failed to load: connect_host

No sé si os sonará el error, pero para los que no lo conozcáis os diré que es muy frecuente cuando se instala PHPMailer en un Host de 1and1. La solución es tan simple como sencilla. De hecho, basta con cambiar una línea en el código que os he propuesto.

La solución es cambiar la 4ª línea del código , que es el isSMP(), por isSendMail();

try {
    $mail->SetLanguage("es", $SPLangDir);
    $mail->FromName = utf8_decode($name); 
    $mail->IsSendMail();
    $mail->SMTPAuth = true;
    // Y todo lo demás desde aquí igual.

Configuración de Gmail

La configuración de Gmail es más o menos distinta con pequeñas peculiaridades:

$dominio = "gmail.com"; // El dominio debe ser este.
$mail->SMTPDebug = 2; // Habilita información SMTP. 1 = errores y mensajes, 2 = solo mensajes. Es opcional.
$mail->SMTPSecure = "ssl"; // Establece el tipo de seguridad SMTP a SSL.
$mail->Host = "smtp.".$dominio; // SMTP a utilizar.
$mail->Port = 465; // Puerto a utilizar, normalmente es el 465 pero puede ser cualquier otro.                              

Como se ve en el código los cambios son mínimos.

Configuración de Hotmail

La configuración de Hotmail tiene características similares a Gmail:

$dominio = "live.com"; // El dominio debe ser este.
$mail->SMTPDebug = 2; // Habilita información SMTP. 1 = errores y mensajes, 2 = solo mensajes. Es opcional.
$mail->SMTPSecure = "ssl"; // Establece el tipo de seguridad SMTP a SSL.
$mail->Host = "smtp.".$dominio; // SMTP a utilizar.
$mail->Port = 25; // Puerto a utilizar, normalmente es el 25 pero puede ser cualquier otro.                              

Al igual que en Gmail, los cambios son mínimos.