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> </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.
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 .
Um arquivo contato.php será dentro da pasta controllers, o outro da pasta views, um será seu controlador o outro a view.
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/
show cara, muito bom
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?
William,
quase um ano depois e seu tutorial ainda serve de muita inspiração. Obrigado por compartilhar.
Abraço
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.
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?
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.
Olá, William.
Não entendi o uso do arquivo “config/email.php”. Onde faço a chamada a ele.