PHPMailer en CodeIgniter

Publicado: 14/02/2010 en CodeIgniter, desarrollo, email, php, phpmailer, Programación
Etiquetas:, , , , , ,

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/

comentarios
  1. Josejm07 dice:

    Sos un capo men gracias

  2. david dice:

    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.

    • Arnau dice:

      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!

  3. Alejandro Cruz dice:

    Mil gracias por el aporte, me sirvió enormemente el tuto, tuve que modificar unos pequeños detaller, pero funciona perfectamente.

  4. Patricio dice:

    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.

      • Patricio dice:

        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!

  5. pablo dice:

    saben si cmabiaron los puertos otra vez de smtp no me conecto nunca al servidor
    SMTP Error: Could not connect to SMTP host.

  6. Micky dice:

    oye me sale el siguiente error » Language string failed to load: tls» algun paquete que deba instalar ???

  7. Sam dice:

    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

  8. Jorge Gonzalez dice:

    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.

  9. jose dice:

    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!

  10. ryder dice:

    Hay alguien q le ha saltado el error q tengo?

  11. ryder dice:

    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

  12. 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!

        • maria dice:

          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!

            • maria dice:

              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…..

            • maria dice:

              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:

                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

                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!

  13. Luis Felipe dice:

    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?

  14. Victor Manuel dice:

    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….

  15. Aldo Saucedo dice:

    Hola..

    Tengo el mismo problema que menciona Marisol arriba pero con algo diferente:

    Language string failed to load: provide_address.

    Alguien me puede ayudar????

  16. luis dice:

    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!

  17. Zerolf dice:

    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.

  18. Alan dice:

    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

  19. martin dice:

    me tira error por todos lados, alguien que le haya funcionado puede colocar el codigo!!!!

  20. marisol dice:

    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.

      • Marisol dice:

        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.'»

  21. luismiguel dice:

    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.. !! 🙂

  22. ¡Qué bueno Agustín! ¡Esto me va a resultar muy útil! Muchas gracias.

Replica a Strange Fatal error: Call to undefined method PHPMailer::SetFrom() With Codeigniter | iphonequestion Cancelar la respuesta