NaszvadiG
4/17/2014 - 8:59 AM

MY_Email.php

<?php

class How_To_Use
    extends Controller
{
    public function index()
    {
        // loading library
        $this->load->library('email');

        // setting up variables
        $vars = array(
            'name' => 'Michael',
        );
        $subject = 'Welcome to My Site';
        $templateName = 'welcome';
        $recipient = 'jonh@nasa.org';
        $emissor   = 'donotreply@spammer.org';

        /** HERE IS THE MAGIC **/
        $this->email->sendEmail(
            $vars, $subject, $templateName,
            $recipient, $emissor
        );
    }
}
<?php
/**
 * iKaza: Seu lar, sua escolha!
 * 
 * iKaza é um sistema imobiliário
 *
 * @author Michael Granados <michaelgranados@gmail.com>
 * @version $Id$
 * @copyright 
 * @package Ikaza
 * @subpackage Library
 */

if (!defined('BASEPATH')) {
    exit('No direct script access allowed');
}

/**
 * Biblioteca de e-mail criada para o iKaza
 *
 * @author Michael Granados <michaelgranados@gmail.com>
 * @version $Id$
 * @package Library
 * @subpackage Core
 */
class MY_Email
    extends CI_Email
{
    /**
     * @var Controller Instancia criada por {@link get_instance()}
     */
    private $_ci = null;
    
    /**
     * @var string Template renderizado em formato HTML
     */
    protected $mailHtmlContent;
    
    /**
     * @var string Template renderizado em formato Texto Puro
     */
    protected $mailTextContent;
    
    /**
     * Constructor da biblioteca
     * 
     * Somente instancia o {@see self::$_ci} e executa o construtor original
     * do {@link http://codeigniter.com CodeIgniter}
     * 
     * @param array $config Config original, conforme a biblioteca original 
     * 
     * @return void
     */
    public function __construct($config = array())
    {
        $this->_ci =& get_instance();
        parent::__consruct($array);
    }
    
    /**
     * Cria um e-mail de forma complexa
     * 
     * Com as variaveis necessarias, o metodo cria um e-mail nos formatos html
     * e plain, salva o e-mail dentro da pasta gerada pelo metodo
     * {@see self::_generateHash()} e envia para o usuário
     * 
     * As variáveis receberão um ponteiro de nome "mailHash" que indica a base
     * do arquivo físico onde o e-mail será enviado. Portanto, no e-mail você
     * pode criar adicionar essa variável indicando ao usuário onde ele pode
     * encontrar esse e-mail.
     * 
     * <pre>
     * Se não consegue ver o e-mail
     *   <a href="<?php site_url($mailHash) ?>"
     *      title="Veja o e-mail em um navegador"
     *   >veja o e-mail em um navegador</a>.
     * </pre>
     * 
     * @uses self::_generateHash()
     * @uses self::makeTemplates()
     * @uses self::writeMailInDisk()
     * @uses parent::send()
     * 
     * @param array  $variables    As variáveis que o template irá reger
     * @param string $subject      Título do e-mail
     * @param string $templateName Nome do template que o metodo usará como base
     * @param string $recipient    Receptor do e-mail
     * @param string $emissor      Emissor do e-mail
     * 
     * @return bool
     */
    public function sendEmail(
        array $variables,
        /* string */ $subject,
        /* string */ $templateName,
        /* string */ $recipient,
        /* string */ $emissor
    ) {
        $variables['mailHash'] = $this->_generateHash(); 
        $this->makeTemplates($templateName, $variables);
        $this->initialize($config = array('mailtype' => 'html'));
        $this->from($emissor)
             ->to($recipient)
             ->subject($subject);
        $this->message($this->mailHtmlContent);
        $this->set_alt_message($this->mailTextContent);
        $this->writeMailInDisk($variables['mailHash']);
        return $this->send();
    }
 
    /**
     * Gera um hash de e-mail
     * 
     * Este método usa o config de email para saber em que pasta o sistema
     * deverá salvar o e-mail. 
     * 
     * @return string
     */   
    private function _generateHash()
    {
        $this->_ci->config->load(
            'email', $use_sections = true, $fail_gracefully = true
        );
        $basePath = $this->_ci->config->item('base_path', 'email');
        $mailhash = sha1(uniqid());
        $mailhash = implode(
            DIRECTORY_SEPARATOR, array(
                $basePath,
                substr($mailhash, 0, 5),
                substr($mailhash, 5, 10),
                substr($mailhash, 10) . '.html'
            )
        );
        return $mailhash;
    }

    /**
     * Cria os templates para usar no e-mail
     * 
     * Cria os templates "plain" e "html" para usar no {@link self::sendMail()}.
     * Os templates do tipo "plain" ganharão o sufixo ".plain.php", enquanto os
     * templates do tipo "html" ganharão do sufixo ".php".
     *
     * @param string $templateName Template base name
     * @param array  $variables    Variables used by template
     *
     * @return void
     */
    protected function makeTemplates(
        /* string */ $templateName, array $variables
    ) {
        $this->mailHtmlContent = get_instance()->load->view(
            $templateName . '.php', $variables, $return = true
        );
        $this->mailTextContent = get_instance()->load->view(
            $templateName . '.plain.php', $variables, $return = true
        );
    }

    /**
     * Escreve o e-mail em um arquivo físico
     * 
     * Dessa forma, podemos enviar ao usuário um link para que ele consiga ver
     * o e-mail dentro de um navegador de sua preferencia.
     * 
     * @param string $mailHash Local onde o e-mail será gravado
     * 
     * @return void
     */
    protected function writeMailInDisk(/* string */ $mailHash)
    {
        $this->_ci->load->helper('file');
        $file = dirname(FCPATH) . DIRECTORY_SEPARATOR . $mailhash;
        $dir  = pathinfo($file, PATHINFO_DIRNAME);
        mkdir($dir, 0777, $recursive = true);
        write_file($file, $this->mailHtmlContent);
    }
}