Criando um formulário de contato com o CodeIgniter

Este será um exemplo básico de um formulário de contato.
Enviar email com o codeigniter é realmente muito fácil, basta utilizar a library email.
Iremos trabalhar com 3 arquivos somente,
Um view (contato.php) um controller(contato.php) e um arquivo de config (email.php).

Deveremos criar eles na estrutura abaixo dentro de sua pasta application:
controllers/contato.php
config/email.php
views/contato.php

Lembrando que para este tutorial funcionar, a url helper deverá estar carregada, $this-load->helper(‘url’); no construtor do controller ou no autoload dentro do config.php
@lucasmezencio

Primeiramente vamos a construção do nosso formulário segue abaixo o html de um form que deverá ser inserido em uma view, vamos chamalo de contato.php.

<?php if(isset($email_enviado)) { ?>
    <div id="mensagem_enviada"><?php echo $email_enviado ?></div>
<?php } ?>
<form id="form_contato" action="<?php echo $action ?>" method="post">
            <div class="campo">
                <label for="nome">Nome: </label><input type="text" name="nome" id="nome" />
            </div>
            <div class="campo">
                <label for="email">E-mail: </label><input type="text" name="email" id="email" />
            </div>
            <div class="campo">
                <label for="telefone">Telefone: </label><input type="text" name="telefone" id="telefone" />
            </div>
            <div class="campo">
                <label for="cidade">Cidade: </label><input type="text" name="cidade" id="cidade" />
            </div>
            <div class="campo">
                <label for="estado">Estado: </label><input type="text" name="estado" id="estado" />
            </div>
            <div class="campo">
                <label for="assunto">Assunto: </label><input type="text" name="assunto" id="assunto" />
            </div>
            <div class="campo">
                <label for="mensagem">Mensagem: </label><textarea name="mensagem" id="mensagem" rows="5" cols="40"></textarea>
            </div>
            <div class="campo">
                <label>&nbsp;</label><button type="submit" id="enviar">Enviar</button>
            </div>
        </form>

Já vou explicar o siguinificado da varíavel $action em nossa view…..
Agora vamos a criação de nosso arquivo config, eu gosto de utilizar o arquivo config para deixar o controller mais enxuto.

email.php

<?php
/*
 * Arquivo Configuração de Email
 * @author William Rufino
 * @version 1.0
 */

$config['protocol']  = 'smtp'; // Podendo ser alterado para mail caso você queira enviar com o mail do php.
$config['charset'] = 'utf8';
$config['wordwrap'] = TRUE;
$config['smtp_host'] = 'mail.xxx.com.br';
$config['smtp_user'] = 'contato+xxx.com.br';
$config['smtp_pass'] = 'xxx;
$config['smtp_timeout'] = 20;
$config['mailtype'] = 'html';

?>

Agora vamos explicar cada item do array $config.

$config[‘protocol’] é o protocolo de envio do email, podendo ter os valores: mail, sendmail, or smtp.
$config[‘charset’] é a codificação de caracteres do seu email, no meu caso utilizo sempre UTF-8 para meus aplicativos.
$config[‘wordwrap’] recebe TRUE/FALSE e indica se deve haver a quebra de palavras ou não (eu indico ficar com TRUE).
$config[‘smtp_host’] é o servidor smtp, caso você escolheu esta opção.
$config[‘smtp_user’] usuário do smtp.
$config[‘smtp_pass’] senha do smtp.
$config[‘smtp_timeout’] é o tempo de espera pela resposta do smtp.
$config[‘mailtype’] é o tipo do email, se será texto (text) ou html.

Criado o seu arquivo de config agora já podemos ir para o nosso controller contato.php

<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');
/*
 * Formulário de contato do website
 *
 * @author William Rufino
 * @version 1.0
 * @category model
 * @access public
 */
class Contato extends Controller {

    /*
     * Construtor da classe
     * @author William Rufino
     * @version 1.0
     */
    public function __construct() {
        parent::Controller();
    }

    /*
     * Método Index, página inicial do formulário de contato
     *
     * @author William Rufino
     * @version 1.0
     * @access public
     */
    public function index() {
        $data['action'] = site_url('contato/enviaEmail');
        $this->load->view('contato', $data);
    }

    /*
     * Método enviaEmail, onde será realmente enviado nosso formulário.
     *
     * @author William Rufino
     * @version 1.0
     * @access public
     */
    public function enviaEmail() {
        $this->load->library('email');

        $email = $this->input->post('email', TRUE);
        $nome = $this->input->post('nome', TRUE);
        $telefone = $this->input->post('telefone', TRUE);
        $cidade = $this->input->post('cidade', TRUE);
        $estado = $this->input->post('estado', TRUE);
        $mensagem = $this->input->post('mensagem', TRUE);
        $assunto = $this->input->post('assunto', TRUE);

        $this->email->from($email, $nome);
        $this->email->to('xxx@xxxx.com.br');

        $this->email->subject($assunto);
        $this->email->message('<html><head></head><body>
            Nome:       ' . $nome . ' <br />
            E-mail:     ' . $email . ' <br />
            Telefone:   ' . $telefone . ' <br />
            Cidade:     ' . $cidade . ' <br />
            Estado:     ' . $estado . ' <br />
            Assunto:    ' . $assunto . ' <br />
            Mensagem:   ' . $mensagem . ' <br />
            </body></html>');

        $em = $this->email->send();
        if ($em) {
            $data['email_enviado'] = 'E-mail enviado com sucesso. Aguarde contato.';
        } else {
            $data['email_enviado'] = 'Erro ao enviar o email. Favor enviar um e-mail para xxx@xxx.com.br';
        }
         $data['action'] = site_url('contato/enviaEmail');
        $this->load->view('contato',$data);
    }

}
/* End of file contato.php */
/* Location: ./system/application/controllers/contato.php */

Vamos a explicação do nosso controller.
O construtor ficará vazio mesmo, nada será feito nele.
No método index, nos simplesmente chamamos o nosso formulário que é a view contato.php e setamos a action do nosso form através do array $data, ficando assim $data[‘action’] = site_url(‘contato/enviaEmail’); , já no método enviaEmail() é onde nosso email será enviado.

Observe que a primeira linha do método é um load na library email.
$this->load->library(‘email’);

Após isso temos que pegar nossos campos vindos através do post. Para isso o CodeIgniter tem a classe Input, ela não precisa ser carregada para funcionar, o método $this->input->post(); pode receber somente um parâmetro que seria o nome do campo, ou também pode receber um segundo parâmetro boolean, que seria o filtro XSS, eu sempre gosto de passar o segundo parâmetro como TRUE quando estou trabalhando com post.
Após setar todas as varíaveis iremos começar a utilização da library email.

Os métodos $this->email->from($email, $nome); e $this->email->to(‘xxx@xxxx.com.br’); setam o remetente e o destino do email, no caso do from o primeiro parâmetro é o email e o segundo o nome, já o método to recebe somente o email destinatário como parâmetro.

O método $this->email->subject($assunto); é onde você seta o assunto do email, nesse caso deixei o assunto que a pessoa enviar pelo formulário, já o método $this->email->message é onde você compõe o corpo da mensagem, neste caso deixei um html bem simples somente com os dados informados.

Agora sim, iremos enviar o email. O método $this->email->send() retorna um true ou false caso o email seja enviado ou não. E dependendo do resultado deste método nos iremos setar o valor da varíavel $data[‘email_enviado’] que será o texto apresentado na sua view, quando o email for enviado. E após tudo isso simplesmente chamo a view passando a array $data como segundo parâmetro novamente.

Talvez em um próximo capítulo eu fale também sobre validação tanto com o juqueri validator como o validation do próprio CodeIgniter.

Se alguem tiver alguma sugestão para um próximo post, fique avontade para falar nos comentários.

11 Comentários

  1. Ola meu caro , não entendi a forma de configura os arquivos , e se eu entedi , vai ter dois arquivos contato.php ? se vc poder responder minha duvida fico grato .

  2. Para funcionar no codeigniter 2.03 é necessário fazer a seguinte alteração no controller contato.php:
    Localize:
    class Contato extends Controller {

    /*
    * Construtor da classe
    * @author William Rufino
    * @version 1.0
    */
    public function __construct() {
    parent::Controller();
    }
    Altere para:

    class Contato extends CI_Controller {

    /*
    * Construtor da classe
    * @author William Rufino
    * @version 1.0
    */
    public function __construct() {
    parent::__construct();
    }

    ________________________________

    Mas eu estou tendo problemas com a linha:
    $data[‘action’] = site_url(‘contato/enviaEmail’); dá o erro:
    Fatal error: Call to undefined function site_url() in application/controllers/contato.php on line 49

    Valewwwww

    • Boa observação!
      A partir da versão 2.0 do framework, os construtores foram pro padrão > 5.0

      E sobre a função site_url()

      ela faz parte do helper URL

      você pode carrega-lo com $this->load->helper, ou adicionando ao autoload.php na pasta config/

  3. show cara, muito bom

  4. Thiagosays:

    Olá, gostaria de saber como coloco auto resposta, para que o visitante do site recebe um e-mail informando que a sua mensagem foi enviada com sucesso. É possivel?

  5. Ibernosays:

    William,

    quase um ano depois e seu tutorial ainda serve de muita inspiração. Obrigado por compartilhar.
    Abraço

  6. Ibernosays:

    Opa quase 3 anos depois…
    Pessoal, leiam com atenção que vai ajudar a executar as funções, pode ser que esteja dando erro de autenticação pra alguém.. como aconteceu comigo e fiquei hoje praticamente o dia todo nisso. Eu uso Wampserver e pra resolver va no PHP.ini e procure extension openssl e remova o comentário ou seja o ; que fica na frente, isso deve ajudar.

  7. Leandrosays:

    Bancana!!!
    Como eu faria para tirar o html do controller e enviar uma view com este html do conteudo do email?
    Trabalho com o Zend, no zend existe o helper $this->view->partial(‘caminho_da_view.phtml’,$dados_do_post) para pegar a view.
    Assim o html nao fica no controller.
    Como faria no CI?

  8. Leandrosays:

    Opa, achei, valeu pessoal. Ficou minha mensagem de contato separado do controller:

    $mensagem = $this->load->view(‘layout_email.php’,$post,true);
    $this->email->message($mensagem);

    Ai só cria mais um arquivo que servira de layout do email, separando o html do controller, deixando ele apenas na view, o seguedo que eu nao sabia era o 3º parametro, que faz com que carregue a view, porem nao renderiza, isso é, vc usa a view como um return.

  9. Waldersays:

    Olá, William.
    Não entendi o uso do arquivo “config/email.php”. Onde faço a chamada a ele.

Deixe um comentário

Por favor, seja educado. Seu e-mail não será publicado e os campos obrigatórios estão marcados.