You can read the English version of this post in http://phpsblog.agustinvillalba.com/phpmailer-codeigniter/
En un post anterior hablé sobre cómo utilizar la librería PHPMailer para enviar correos electrónicos desde nuestro sitio web sin necesidad de tener nuestro propio servidor de correos corriendo en la máquina. En esta ocasión vamos a ir un poco más allá y explicaré cómo integrar esa librería en nuestro proyecto CodeIgniter y no morir en el intento.
Lo primero que hemos de hacer, si no lo hemos hecho ya, será descargarnos la librería. Una vez tenemos la librería la descomprimimos, renombramos la carpeta con el nombre PHPMailer y la movemos a la carpeta /system/application/libraries de nuestra aplicación CodeIgniter. Una vez hecho esto, ya podemos comenzar a implementar nuestra propia librería, la cual se encargará de hacer la inclusión de PHPMailer en nuestra aplicación. Para ello hemos de crear un nuevo archivo PHP en el directorio application/libraries llamado my_phpmailer.php. En él escribiremos el siguiente código:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class My_PHPMailer { public function My_PHPMailer() { require_once('PHPMailer/class.phpmailer.php'); } } ?>
Con esto ya podemos utilizar la librería PHPMailer desde nuestro controladores. Para ello hemos de escribir el siguiente código en nuestro controlador:
<?php class My_Controller extends Controller { public function My_Controller(){ parent::Controller(); $this->load->library('My_PHPMailer'); } public function send_mail() { $mail = new PHPMailer(); $mail->IsSMTP(); // establecemos que utilizaremos SMTP $mail->SMTPAuth = true; // habilitamos la autenticación SMTP $mail->SMTPSecure = "ssl"; // establecemos el prefijo del protocolo seguro de comunicación con el servidor $mail->Host = "smtp.gmail.com"; // establecemos GMail como nuestro servidor SMTP $mail->Port = 465; // establecemos el puerto SMTP en el servidor de GMail $mail->Username = "minombreusuario@gmail.com"; // la cuenta de correo GMail $mail->Password = "contraseña"; // password de la cuenta GMail $mail->SetFrom('info@tudominio.com', 'Nombre Apellido'); //Quien envía el correo $mail->AddReplyTo("response@tudominio.com","Nombre Apellido"); //A quien debe ir dirigida la respuesta $mail->Subject = "Asunto del correo"; //Asunto del mensaje $mail->Body = "Cuerpo en HTML<br />"; $mail->AltBody = "Cuerpo en texto plano"; $destino = "destinatario@otrodominio.com"; $mail->AddAddress($destino, "Juan Palotes"); $mail->AddAttachment("images/phpmailer.gif"); // añadimos archivos adjuntos si es necesario $mail->AddAttachment("images/phpmailer_mini.gif"); // tantos como queramos if(!$mail->Send()) { $data["message"] = "Error en el envío: " . $mail->ErrorInfo; } else { $data["message"] = "¡Mensaje enviado correctamente!"; } $this->load->view('sent_mail',$data); } }
Con este código ya tenemos implementado el envío de correos electrónicos desde nuestra aplicación CodeIgniter mediante la librería PHPMailer.
You can read the English version of this post in http://phpsblog.agustinvillalba.com/phpmailer-codeigniter/
[…] https://phpsblog.wordpress.com/2010/02/14/phpmailer-en-codeigniter/ […]
Sos un capo men gracias
Hola a todos!!! Estoy desesperado xq no consigo enviar un maldito correo y ya he probado varios metodos…. Siguiendo los pasos del blog me da este error:
Language string failed to load: tls Error en el env�o: Language string failed to load: tls
Mi codigo es el siguiente:
$this->load->library(‘My_PHPMailer’);
$mail = new PHPMailer();
$mail->IsSMTP(); // establecemos que utilizaremos SMTP
$mail->SMTPAuth = true; // habilitamos la autenticación SMTP
$mail->SMTPSecure = «tls»; // establecemos el prefijo del protocolo seguro de comunicación con el servidor
$mail->Host = «smtp.gmail.com»; // establecemos GMail como nuestro servidor SMTP
$mail->Port = 465; // establecemos el puerto SMTP en el servidor de GMail
$mail->Username = «micorreo@gmail.com»; // la cuenta de correo GMail
$mail->Password = «micontraseña»; // password de la cuenta GMail
$mail->SetFrom(‘pana.tejao@gmail.com’); //Quien envía el correo
$mail->AddReplyTo(«micorreo@gmail.com»); //A quien debe ir dirigida la respuesta
$mail->Subject = «Asunto del correo»; //Asunto del mensaje
$mail->Body = «Cuerpo»;
//$mail->AltBody = «Cuerpo en texto plano»;
$destino = «micorreo@gmail.com»;
$mail->AddAddress($destino, «Juan Palotes»);
if(!$mail->Send()) {
echo»Error en el envío: » . $mail->ErrorInfo;
} else {
echo»¡Mensaje enviado correctamente!»;
}
Gracias de antemano.
Hola David,
Perdona por la demora en la respuesta. El problema es que Google cambió el protocolo de comunicación cifrada, ahora es ssl. Ya lo actualicé en el post.
Prueba a utilizar «ssl» en lugar de «tls» en tu código.
Un saludo.
Agustín.
Hola, mira queria hacerte una pregunta, estoy intentando mandar emails y me funciona pero solo entre gmails es muy raro si intento enviar algo a un hotmail otro servidor no me da error pero tampoco recibo el email sabrias a que se debe?
Gracias de antemano
Es muy extraño. Pero si los correos se envían y se reciben, significa que el código funciona. Tu problema está fuera del código, debería comprobar si hay algún tipo de reglas, cortafuegos, proxys, etc.
Saludos!
Mil gracias por el aporte, me sirvió enormemente el tuto, tuve que modificar unos pequeños detaller, pero funciona perfectamente.
Genial Alejandro!
Me alegro que te haya servido de ayuda!
Saludos!
Hola Agustin, mira soy novato y tengo el siguiente problema :
En el hosting donde tengo mi pagina web nos anunciaron que los formularios simples, si podemos llamarlo así, no se podran enviar debido a que entraron muchos Spam. Nos recomendaron usar esta apliacion PhpMailer pero no se como llevarla ami formulario, estos eran 3 (contacto.html – contacto.php y contactorespuesta.html.
En contacto.html tengo el formulario dentro de y un scritp sencillo de completacion de datos.
En contacto.php, tengo un script donde informa al formulario de enviar al correo «tanto@mipagina.com» y luego si todo esta ok me envia a una pagina de respuesta donde da las gracias por el envio.
Todo siempre funciono muy bien, hasta que ellos dijeron que tenia que ocupar esta aplicación.
Me puedes ayudar a implementarlo por favor, se te agradece desde ya, si quieres me puedes enviar un correo para la explicación ( si es muy larga, ejjejjejejej ).
Atte.
Patricio
Hola Patricio,
tan sólo has de colocar el código que ves en el artículo en tu contacto.php, con eso debería bastar.
Saludos.
O sea, tu me dices que debo eliminar todo mi código que esta en contacto.php y reemplazarlo por este código, a esto tu lo llamas controlador?
Se pueden eliminar alguna lineas de código, cuales?
En la parte superior indicas que la librería se debe colocar en un carpeta, eso se hace en el servidor de mi hosting o se hace si uno lo tiene Gmail.
Ademas indicas que se debe crear un archivo llamado my_phpmailer.php y colocarlo en esta mis carpeta.
Te das cuenta que me falta mucho de comprender esto, se agradece tu ayuda.
Gracias
No no, cuidado. En este artículo se explica cómo integrar la librería PHPMailer en el framework CodeIgniter. Por lo que veo, tu no estás utilizando CodeIgniter para desarrollar tu sitio, así que el código de este artículo no te servirá tal cual. Para eso te recomiendo que leas el artículo dónde explico cómo utilizar PHPMailer: PHPMailer: Envía correos desde tu web. En este explico cómo utilizarlo de forma genérica, sin tener en cuenta las particularidades de CodeIgniter.
Saludos!
saben si cmabiaron los puertos otra vez de smtp no me conecto nunca al servidor
SMTP Error: Could not connect to SMTP host.
oye me sale el siguiente error » Language string failed to load: tls» algun paquete que deba instalar ???
No. Probablemente tengas un error en tu codigo, según deduzco del error, estás usando la librería Language, de la cual no hablo para nada en el artículo.
Saludos!
a mi me sale el mismo error como lo resolviste?
A PHP Error was encountered
Severity: Warning
Message: require_once(PHPMailer/class.phpmailer.php): failed to open stream: No such file or directory
Filename: libraries/my_phpmailer.php
Line Number: 7
a mi me da este error y copie y pegue igual todo…. alguna idea
Has de asegurarte colocar el directorio PHPMailer que te has decargado dentro de la carpeta application/libraries de CI.
Tengo el mismo error
A PHP Error was encountered
Severity: Warning
Message: require_once(PHPMailer/class.phpmailer.php): failed to open stream: No such file or directory
Filename: libraries/my_phpmailer.php
Line Number: 7
y la carpeta PHPMailer la tengo en esta carpeta application/libraries de CI.
¿Has revisado los permisos del archivo? Quizás Apache no puede leer el archivo y por lo tanto, PHP no puede ejecutarlo.
Pues aunque tuve que cambiarle algunos detalles, me botan 3 warnings:
Severity: Warning
Message: fsockopen() [function.fsockopen]: SSL: Success
Filename: PHPMailer/class.smtp.php
Line Number: 122
A PHP Error was encountered
Severity: Warning
Message: fsockopen() [function.fsockopen]: Failed to enable crypto
Filename: PHPMailer/class.smtp.php
Line Number: 122
A PHP Error was encountered
Severity: Warning
Message: fsockopen() [function.fsockopen]: unable to connect to tls://smtp.gmail.com:587 (Unknown error)
Filename: PHPMailer/class.smtp.php
Line Number: 122
Mientras lo soluciono busco otros posts.
Cambia el valor de la variable $mail->Port. En lugar de 587 ponle 465. Ya lo actualicé en el artículo también. Es que Google cambió el puerto por el que recibe las conexiones SSL de GMail.
esta muy bueno podrias colocar un enlace con descarga y un ejemplo basico para mandar corrios desde gmail
El código no es más que ese. Simplemente tendrás que modificar el nombre del controlador al que tu elijas, y renombrar alguna variable si lo deseas. Pero el código para poder enviar correos desde CodeIgniter no es más que ese. Si tienes alguna duda en concreto entre todos podremos ayudarte!
Saludos!
Hay alguien q le ha saltado el error q tengo?
Si pudieras mostrarnos tu código quizás sería más fácil buscar el error entre todos!
Saludos y suerte!
me salta el siguiente error:
Severity: Warning
Message: stream_socket_enable_crypto() [streams.crypto]: this stream does not support SSL/crypto
Filename: PHPMailer/class.smtp.php
Line Number: 197
Muchas gracias! anda de 10, solo que hay un error en estas lineas:
$destino = «destinatario@otrodominio.com»;
$mail->AddAddress($address, «Juan Palotes»);
hay que cambiarlas por:
$destino = «destinatario@otrodominio.com»;
$mail->AddAddress($adestino, «Juan Palotes»);
Saludos!!
le pifee una «a»
$destino = “destinatario@otrodominio.com”;
$mail->AddAddress($destino, “Juan Palotes”);
Muchas gracias Tandil! Se me pasó en el copy/paste, jejeje. Ya está corregido!
Saludos!
urgente plisssss necesito este codigo para hoy urgente necesito entregar un proyecto me lo podrias facilitar te estaria muy agradecida
Hola! El código es el que está en el blog, lo puedes copiar y pegar sin problemas! Saludos y suerte!
lo que sucede es que no entiendo bien lo referente a lo de la libreria phpemailer, sobre en que carpeta debo ponerlas exactamente lo que sucede es que soy nueva en esto y no entiendo mucho y queria saber si tengo que hacer una vista con codigo en html para mostrar o si con lo del controlador es suficiente por eso queria saber si a lo mejor me explicabas un poco mas esas partes…..
Depende de para qué lo quieras. Si lo único que quieres es enviar correos electrónicos sin la interacción del usuario no necesitas vistas, únicamente con el código del controlador te vale.
lo quiero para enviar un formulario de contactos a una cuenta de correo y lo de las librerias en que carpetas las especificas del codeinther las pongo yo le agradezco mucho su ayuda….
En el artículo se da una explicación bastante detallada de dónde se debe colocar la librería dentro de la estructura de Codeigniter:
En la explicación se asumen unos conocimientos mínimos necesarios de PHP para poder llevar a cabo la implementación.
Saludos y suerte con tu proyecto!
ok muchas gracias……..
Ahm… aunque es util la integración de otras librerías, ¿por qué integrar phpMailer cuando ya hay una libreria de correo propia de CI?
Me lanza el siguiente error….
stream_socket_enable_crypto() [streams.crypto]: this stream does not support SSL/crypto
Ya le cambie el modo a ssl a tls cambie de puertos y no funca….
Hola..
Tengo el mismo problema que menciona Marisol arriba pero con algo diferente:
Language string failed to load: provide_address.
Alguien me puede ayudar????
me lanza el siguiente error
Unable to load the requested class: my_phpmailer
Hola Luis,
por si acaso, asegúrate que el nombre del archivo que hace el include_once de la librería sea exactamente My_PHPMailer.php en el directorio system/applications/libraries/.
Por lo demás no debería darte problemas!
Hola amigo.. muy bueno tu articulo logre implementarlo.. pero si quisiera ahora recibir al sistema los correos(leerlos).. puedes dar un tic de como hacerlo?
Hola Zerolf! Para hacer un sistema de recepción de correos, o al menos poder leer los correos de GMail en tu sistema es más complicado. Nunca he necesitado hacerlo, te recomiendo que busques en Google algo sobre alguna API de Gmail para poder incrustar la bandeja de entrada en tu sistema, pero desde ya te advierto que no va a ser fácil. Y creo, si no recuerdo mal, que no se puede. De todas formas, si lo consigues pásanos el reporte si no te importa! Mucha suerte! Saludos.
Hola amigo soy recontranuevo en codeigniter pero como todos tengo ganas de aprender, ami no me sale nada pero tengo preguntas basicas del codigo del que debo poner en el archivo «my_phpmailer.php» en el codigo BASEPATH’ y si tienes un archivo ejemplo de vista «view(‘sent_mail’,$data);» para mostrar el resultado. otra pregunta si hay que configurar el puerto o el gmail para que funcione el enviar email.
Gracias
me tira error por todos lados, alguien que le haya funcionado puede colocar el codigo!!!!
O mejor, dejanos ver tu codigo, a ver donde puede estar tu error. Saludos!
Hola,
Quisiera saber si alguien me pudiera ayudar, sale un error al momento de ejecutar mi funcion y no lo entiendo.
El error es el siguiente:
«Unable to load the requested class: classmailer»
Así a bote pronto, todo indica que estás intentando utilizar una clase que no existe en CI. De todas formas, para poder ayudarte mejor sería conveniente que pusieras el código donde utilizas esa clase.
Ok, Bueno ya solucione ese problema.. era en el load_vieuw, pero ahora no me envia los mails, en error del log message me aparece lo sig:
» Error en el envío:’.Language string failed to load: from_failedroot@localhost.'»
hola estuve probando todas las formas posibles del mundo y nunca me salia
quite el «;» de la extencion y nada instale el openssl y nada,
cambie de puerto y nada nada de nada de nada….
HASTA QUE PORSIACASO DIJE VOY A PROBARLO EN MI CENTOS Y ME FUNCIONO DE LA PATADA.. !! 🙂 TODO HERMOSO.. !! 🙂
¡Qué bueno Agustín! ¡Esto me va a resultar muy útil! Muchas gracias.
Algo de eso me habías comentado hace un tiempo… Pues aquí está!