domingo, 8 de marzo de 2015

Envió de correo con PHPMailer y Gmail (Xampp)

Hay muchas maneras de enviar correos a través de PHP, pero casi siempre es un dolor de cabeza (no soy el primero que lo escribe), con PHPMailer es algo si se quiere sencillo, en este ejemplo estoy utilizando "xampp-linux-5.6.3-0" y "PHPMailer V5.2.9 (master.zip)".

Para comenzar, PHPMailer tiene ejemplos que podemos seguir y partir de allí, están dentro de la carpeta "examples" y pueden servir de ayuda, también el archivo "README" contiene un ejemplo básico y es el que tomé para este ejemplo.

<?php require 'PHPMailerAutoload.php'; $mail = new PHPMailer; $mail->SMTPDebug = 2; /* Enable verbose debug output */ $mail->isSMTP(); /* Set mailer to use SMTP */ $mail->Host = 'smtp.gmail.com'; /* Specify main and backup SMTP servers */ $mail->SMTPAuth = true; /* Enable SMTP authentication */ $mail->Username = 'usuario@gmail.com'; /* SMTP username */ $mail->Password = 'Super~Password'; /* SMTP password */ $mail->SMTPSecure = 'tls'; /* Enable TLS encryption, 'ssl' also accepted */ $mail->Port = 587; /* TCP port to connect to */ $mail->Helo = 'localhost'; /* Permite usar EHLO / HELO */ $mail->Hostname = 'gmail.com'; /* Permite usar un hostname */ $mail->From = 'usuario@gmail.com'; /* Correo Gmail */ $mail->FromName = 'Pedro Pérez'; /* Nombre de usuario Gmail */ $mail->addAddress('usuario-2@live.com', 'Fulanito de Tal'); /* Add a recipient / correo de destino */ // $mail->addAddress('ellen@example.com'); /* Name is optional */ // $mail->addCC('cc@example.com'); // $mail->addBCC('bcc@example.com'); // $mail->addAttachment('/var/tmp/file.tar.gz'); /* Add attachments / agregar un archivo*/ // $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); /* Optional name */ $mail->isHTML(true); /* Set email format to HTML / Comentar para texto plano */ $mail->Subject = 'Prueba de Email usando PHPMailer y Gmail'; /* Asunto */ $mail->Body = 'Aquí se escribe el mensaje a mostrar!!'; /* Lo que se mostrará en el mensaje */ if(!$mail->send()) { echo 'Message could not be sent.'; echo 'Mailer Error: ' . $mail->ErrorInfo; } else { echo 'Message has been sent'; } ?>

Quedaría más o menos así:


Nada del otro mundo, además que está comentado, pero para que no queden dudas explico lo más importante.

"require 'PHPMailerAutoload.php';" → dependencia de PHPMailer.

SMTPDebug = 2; → activamos el modo debug.
isSMTP(); → utilizamos SMTP.
Host = 'smtp.gmail.com'; → SMTP de gmail.
SMTPAuth = true; → Actíva la autenticación SMTP.
SMTPSecure = 'tls'; → Usamos tls.
Port = 587; → El puerto de conexión es el 587.
Helo = 'localhost'; → Usamos EHLO / HELO.
Hostname = 'gmail.com'; → Asignamos un hostname.
Username = 'usuario@gmail.com'; → Usuario de Gmail.
Password = 'clave'; → Su contraseña.
From = 'usuario@gmail.com'; → Usuario de Gmail.
FromName = 'Nombre Ap.'; → Nombre del usuario de Gmail.
addAddress('destino@live.com', 'Nombre Des.'); → Correo de destino.

addAttachment('/var/tmp/file.tar.gz'); → Archivo adjunto.
isHTML(true); → Activamos / Desactivamos HTML.
Subject = 'Correo de aviso'; → El asunto de correo.
Body = 'Este es el mensaje'; → El mensaje como tal.

Comentar que en "Helo" se puede colocar lo que se desee, es lo que se muestra justo antes de la dirección ip, (Received: from localhost ([190.61.55.55])), y "Hostname" es lo que se mostrará en al final de "message-ID", (Message-ID: <2b4366312uw3eebe1z3s@gmail.com>), para terminar, si queremos enviar el correo en "texto plano" debemos comentar "isHTML(true);".

Con esto ya estaría todo listo para enviar un correo, si se presenta algún problema con en mi caso, que no podía enviar el correo por problemas de certificados la solución la conseguí y fue algo sencillo, añadir unas líneas de código y listo.

El error es algo parecido a esto:

Warning: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in /Applications/XAMPP/xamppfiles/htdocs/phpMailer/class.smtp.php on line 338

La Solución es agregar algunas líneas de código al archivo "class.smtp.php", las líneas a agregar van cerca de la línea número 242 y debería quedar más o menos así.

public function connect($host, $port = null, $timeout = 30, $options = array()) { if(count($options)==0){ $options["ssl"]=array("verify_peer"=>false,"verify_peer_name"=>false,"allow_self_signed"=>true); }

Ejemplo:


El comentario de donde tomé el ejemplo está en el siguiente enlace:
Comentario en hithub.

Solucionado lo anterior, sin ningún problema se debería poder enviar mensajes, si tienen problemas con los acentos, pueden editar el archivo "class.phpmailer.php" en la línea 47 "public $CharSet = 'iso-8859-1';" y colocar "'UTF-8'" en lugar de "'iso-8859-1'".

Descargar PHPMailer.

6 comentarios:

Roberto Cruz dijo...

Muchas gracias, me sirvió de mucho tu ejemplo!!!.

L.J.Marín dijo...

Me alegra que te sirviera el ejemplo Roberto, de nada (:

Miguel Sepulveda dijo...

Funciona excelente muchas gracias!

L.J.Marín dijo...

Por nada Miguel, y que bueno que todavía funciona xD saludos.

jose carlos aguilar dijo...

Gracias, esttuve dando vueltas pr todo google y nada exepto tu solucion funciono. gracias por compartir.

L.J.Marín dijo...

Me alegra que te haya servido Jose, saludos.