Enviando emails com a biblioteca Email do CodeIgniter

Enviando emails com a biblioteca Email do CodeIgniter

13/04/2016 13 Por Jonathan Lamim

Nesse tutorial você vai aprender a enviar emails utilizando uma bibiotca nativa do CodeIgniter, a Email.

Essa library permite você fazer o envio de emails usando a função mail() do PHP, STMP, Sendmail, com poucas linhas de configuração direto no CodeIgniter.

Para iniciarmos o tutorial, faça o download a instalação do CodeIgniter em seu ambiente de desenvolvimento. Após instalar o CodeIgniter, prossiga com o tutorial.

Passo 1 – Configurações

Algumas configurações são necessárias para que o funcionamento da biblioteca Email e a aplicação desse exemplo funcionem corretamente. Acompanhe a seguir:

Helper

Vamos configurar o helper URL no autoload para que possamos ter acesso a métodos como o base_url(), que retorna uma URL absoluta da aplicação.

Abra o arquivo application/config/autoload.php e localize a linha $autoload['helpers'] = array('') e altere essa linha inserindo o nome da biblioteca no array que é passado para a chave libraries.

$autoload['helper'] = array('url');

A partir desse momento o helper URL já está sendo carregado no autoload e suas funcionalidades estarão disponíveis em qualquer lugar da aplicação.

Rota

Vamos configurar uma rota para chamar o método que fará o envio do email e atulizar a rota que vai exibir a página principal da aplicação. Para isso abra o arquivo application/config/routes.php, e atualize – ou crie – as linhas abaixo no arquivo.

$route['default_controller'] = "Base";
$route['enviar-email'] = "Base/EnviarEmail"

A rota default_controller, que chama o controlador Base, define o controlador padrão da aplicação e consequentemente a página principal dela, que nesse caso será a view carregada no método Index() do controlador Base.

A rota enviar-email, vai ser usada para processar o formulário com os dados a serem enviados por email, chamando o método EnviarEmail(), que será criado mais adiante no controlador Base.

Passo 2 – Criando as views

Vamos utilizar 2 views para esse tutorial. Uma conterá o formulário onde serão preenchidos os dados que serão encaminhados para um email, e a outra será o template do email.

View home.php

Crie um arquivo chamado home.php dentro do diretório application/views e insira nele o código abaixo:

<?php if ($this->session->flashdata('success') == TRUE): ?>
<div><?= $this->session->flashdata('success'); ?></div>
<?php endif; ?>
<?php if ($this->session->flashdata('error') == TRUE): ?>
<div><?= $this->session->flashdata('error'); ?></div>
<?php endif; ?>

<form method="POST" action="<?=base_url('enviar-email')?>">

<div>
<label>Seu nome</label>
    <input type="text" name="nome" required/>
</div>

<div>
    <label>Seu email</label>
    <input type="email" name="email" required/>
</div>

<div>
    <label>Uma mensagem pra você</label>
    <textarea name="mensagem" rows="6" required></textarea>
</div>

<div>
    <label><input type="checkbox" name="anexo"/><strong>Enviar anexo</strong></label>
</div>

<div>
    <label><input type="checkbox" name="template"/><strong>Usar template</strong></label>
</div>

<div>
    <input type="submit" value="Enviar"/>
</div>

</form>

Esse código é apenas do formulário, você precisará complementá-lo com o cabeçalho padrão de paginas HTML.

Temos um formulário com 5 campos e um botão para envio dos dados. Dentre os campos temos campos do tipo text, email, checkbox, textarea, e esses campos recebem informações como nome, email, mensagem, arquivo anexado e o checkbox define se o email será enviado com um layout personalizado, ou será enviado sem layout, somente como um texto simples.

Antes do formulário temos 2 ifs que verificam mensagens passadas através de sessão, onde vão exibir para o usuário os erros ocorridos durante o processo ou então a mensagem de email enviado com sucesso.

View – email-template.php

Essa será a view responsável por enviar um email com um layour personalizado, caso o usuário marque o checkbox Usar Template do formulário.

Crie o arquivo email-template.php em application/views e adicione a ele o código abaixo:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Enviando emails com a Biblioteca Email do CodeIgniter</title>
</head>
<body>
    <table cellspacing="0" cellpadding="0" border="0" width="100%">
        <tr>
            <td class="navbar navbar-inverse" align="center">                
                <table width="650px" cellspacing="0" cellpadding="3" class="container">
                    <tr class="navbar navbar-inverse">
                        <td colspan="4"><a class="brand" href="http://www.tutoriaiscodeigniter.com.br">TutoriaisCodeIgniter</a></td>
                    </tr>
                </table>
            </td>
        </tr>
        <tr>
            <td bgcolor="#FFFFFF" align="center">
                <table width="650px" cellspacing="0" cellpadding="3" class="container">
                    <tr>
                        <td><?=$mensagem?></td>
                    </tr>
                </table>
            </td>
        </tr>
        <tr>
            <td bgcolor="#FFFFFF" align="center">
                <table width="650px" cellspacing="0" cellpadding="3" class="container">
                    <tr>
                        <td>
                            <hr>
                            <p>© Tutoriais CodeIgniter – 2019</p>
                        </td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>
</body>
</html>

Ele tem um template simples, formatado através de tabelas, e chamando a variável $mensagem, que contém  a mensagem digitada pelo usuário no campo Mensagem do formulário.

Passo 3 – Criando o controlador

Agora vamos criar o controlador para finalizar o processo de criação das funcionalidades e ter o envio de emails funcionando.

Crie um arquivo chamado Base.php em application/controllers e adicione a ele o código abaixo:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Base extends CI_Controller {

    function __construct() {
       parent::__construct();
       /*
        * Carrega a library 'session' para que seja possível fazer o uso 
        * das sessões na aplicação 
        */         
       $this->load->library('session');

    }

    /*
     * Responsável por carregar a view com o formulário
     */
    public function Index()
    {
        $this->load->view('home');
    }

    /*
     * Responsável por enviar o email
     */
    public function EnviarEmail()
    {
        // Carrega a library email
        $this->load->library('email');

        //Recupera os dados do formulário
        $dados = $this->input->post();

        //Inicia o processo de configuração para o envio do email
        $config['protocol'] = 'mail'; // define o protocolo utilizado
        $config['wordwrap'] = TRUE; // define se haverá quebra de palavra no texto
        $config['validate'] = TRUE; // define se haverá validação dos endereços de email

        /*
         * Se o usuário escolheu o envio com template, define o 'mailtype' para html, 
         * caso contrário usa text
         */
        if(isset($dados['template']))
            $config['mailtype'] = 'html';
        else
            $config['mailtype'] = 'text';

        // Inicializa a library Email, passando os parâmetros de configuração
        $this->email->initialize($config);

        // Define remetente e destinatário
        $this->email->from('remetente@email.com', 'Remetente');
        $this->email->to($dados['email'],$dados['nome']);

        // Define o assunto do email
        $this->email->subject('Enviando emails com a library nativa do CodeIgniter');

        /*
         * Se o usuário escolheu o envio com template, passa o conteúdo do template para a mensagem
         * caso contrário passa somente o conteúdo do campo 'mensagem'
         */
        if(isset($dados['template']))
            $this->email->message($this->load->view('email-template',$dados, TRUE));
        else
            $this->email->message($dados['mensagem']);

        /*
         * Se foi selecionado o envio de um anexo, insere o arquivo no email 
         * através do método 'attach' da library 'Email'
         */
        if(isset($dados['anexo']))
            $this->email->attach('./assets/images/unici/logo.png');

        /*
         * Se o envio foi feito com sucesso, define a mensagem de sucesso
         * caso contrário define a mensagem de erro, e carrega a view home
         */
        if($this->email->send())
        {
            $this->session->set_flashdata('success','Email enviado com sucesso!');
            $this->load->view('home');
        }
        else
        {
            $this->session->set_flashdata('error',$this->email->print_debugger());
            $this->load->view('home');
        }
    }
}

O código acima está todo comentado para facilitar a compreensão de cada parte dele. Mas há um ponto importante que precisa ser mais explicado, que é o processo de configuração da biblioteca Email. Essa biblioteca possui vários parâmetros, veja a seguir a definição de cada um deles:

  • useragent: O "user agent"
    • valor padrão: CodeIgniter
  • protocol: O protocolo para envio do email
    • valor padrão: mail
    • opções: mail, sendmail, ou smtp
  • mailpath: Path para o servidor do Sendmail
    • valor padrão: /usr/sbin/sendmail
  • smtp_host: Endereço do servidor SMTP
  • smtp_user: Usuário do SMTP
  • smtp_pass: Senha do SMTP
  • smtp_port: Porta do SMTP
    • valor padrão: 25
  • smtp_timeout: Timeout do SMTP (em segundos)
    • valor padrão: 5
  • smtp_keepalive: Ativa conexão SMTP persistente
    • valor padrão: FALSE
    • opções: TRUE ou FALSE
  • smtp_crypto: Modo de encriptação do SMTP
    • opções: tls ou ssl
  • wordwrap: Ativa quebra de palavra
    • valor padrão: TRUE
    • opções: TRUE ou FALSE
  • wrapchars: Número de caractéres para a quebra
    • valor padrão: 76
  • mailtype: Tipo de email. Se for HTML o conteúdo será enviado como uma página web. Fique atento a links e caminhos de imagens relativos, pois eles não irão funcionar
    • valor padrão: text
    • opções: text ou html
  • charset: Codificação de caracteres (utf-8, iso-8859-1, etc.)
    • valor padrão: $config['charset']
  • validate: Validação do email
    • valor padrão: FALSE
    • opções: TRUE ou FALSE
  • priority: Prioridade do email 1 = alta. 5 = baixa. 3 = normal
    • valor padrão: 3
    • opções: 1, 2, 3, 4, 5
  • crlf: Caracter para quebra de linha (Use "\r\n" para atender à RFC 822)
    • valor padrão: "\n"
    • opções: "\r\n" ou "\n" ou "\r"
  • newline: Caracter para quebra de linha (Use "\r\n" para atender à RFC 822)
    • valor padrão: "\n"
    • opções: "\r\n" ou "\n" ou "\r"
  • bccbatchmode: Ativa o modo BCC Batch
    • valor padrão: FALSE
    • opções: TRUE ou FALSE
  • bccbatchsize: Número de email para BCC Batch
    • valor padrão: 200
  • dsn: Ativa notificações de mensagem para o servidor
    • valor padrão: FALSE
    • opções: TRUE ou FALSE

Esses são os parâmetros de configuração que podem ser utilizados para o envio de email usando a biblioteca Email, nativa do CodeIgniter.

O tempo entre o envio e o recebimento do email vai variar conforme o servidor utilizado.

Para enviar emails utilizando o protocolo SMTP, você deverá configurar os seguintes parâmetros:

  • protocolo: smtp
  • smtp_host: Endereço do servidor SMTP
  • smtp_user: Usuário do SMTP
  • smtp_pass: Senha do SMTP
  • smtp_port: Porta do SMTP

Com essa configuração, você procede com o envio normalmente através de $this->email->send() e demais métodos para setar as informações do email como remetente, destinatário, assunto e mensagem.

Você pode realizar o download do código fonte completo através do botão abaixo.

Download do código-fonte

Bons estudos!