Como enviar um e-mail autenticado com CodeIgniter

Olá, tudo bem?

Hoje, se você enviar um e-mail simplesmente usando a função mail() do PHP ou então usando a porta 25, muito provavelmente seu e-mail cairá na caixa de SPAM do destinatário.

Isso porque a porta 25 não exige autenticação para enviar um e-mail, o que faz com que seja possível você se passar como dono de qualquer conta de e-mail e enviar para seus destinatários.

Nem preciso falar na treta que dá isso né?

Então, a solução para que seu e-mail chegue na caixa de entrada do seu destinatário, é enviar sua mensagem autenticada, ou seja, conectando a um servidor SMTP com autenticação e com encriptação SSL, inclusive.

Hoje vamos ver como utilizar o servidor SMTP do gmail para enviar e-mails autenticados usando a sua conta no Google.

O primeiro passo é você criar um arquivo de configuração do seu e-mail.

Crie um arquivo chamado email.php e salve-o dentro da pasta application/config.

Ao fazer isto, o CodeIgniter já vai identificar automaticamente que existe uma configuração de e-mail a ser utilizada e vai passar a ler os dados deste arquivo.

Você até pode colocar estas configurações direto no seu Controller antes de enviar o e-mail, mas isso não tem muito sentido, pois você terá que chamar esta configuração a cada vez que for enviar um e-mail novo.

O ideal mesmo é criar o arquivo como falado acima.

Dentro do arquivo, você vai colocar o seguinte código:

As configurações acima são auto explicativas, mas as mais importantes são o servidor SMTP, que de preferência deve ter SSL, a porta, o seu email e sua senha ativos no Gmail.

Feito isto, o próximo passo agora é você enviar o e-mail desejado, mas antes você precisa carregar a biblioteca.

Se você for usar somente em um único método dentro do seu controller, basta carregar a biblioteca somente neste método, caso vá utilizar para todo o controller, coloque no __construct(), para toda a classe poder utilizá-lo.

Ou então, coloque no autoload.php dentro da pasta config, assim quando a aplicação rodar, já estará disponível.

Certo, agora basta enviar o email.

Para isto, use o código abaixo:

Bom, o código também é autoexplicativo. Você não precisa colocar tudo que está ali, como CC, BCC ou REPLY_TO por exemplo.

Sem isto já dá pra enviar emails.

Quando você chamar a função send() ela vai retornar TRUE quando o e-mail for enviado com sucesso e FALSE caso não.

Você pode também saber qual erro ocorreu ao enviar o e-mail analisando a função $this->email->print_debugger().

Ao dar um echo nesta função ele irá retornar todo o conteúdo do e-mail com o erro gerado.

Anexos

Você também pode enviar anexos no seu e-mail e é muito simples.

Basta adicionar a linha abaixo antes do send():

Você também pode anexar uma URL com um arquivo, por exemplo:

Bom, neste post eu mostrei o básico para poder enviar e-mails usando o CodeIgniter.

Esta biblioteca tem mais algumas opções interessantes, mas para isto sugiro dar uma olhada no artigo original clicando aqui.

É isto, dúvidas comente abaixo.

Abraços

Fábio

Fábio S. Reszko

Sou Programador PHP desde 2006 e eu acredito sinceramente que programar usando um Framework PHP é a solução para os problemas de códigos desorganizados, difíceis de entender e de dar manutenção no futuro. Se você também acredita nisto, então fique à vontade em explorar meu blog.

  • Júlio

    Olá Fábio… faltou mencionar que no Controller faz-se necessário carregar a library(‘email’).

  • Verdade Júlio, que mancada. Obrigado por avisar. Post já corrigido.

  • Walney Moreira Klein

    onde coloco este codigo para enviar um email ? poderia dar um exemplo ? e como fazer o teste se tudo ocorreu perfeitamente ? e tem como ter um form para enviar ? tipo form de contato ?

  • Fernando

    Da para fazer teste no localhost ou tem que colocar no ar para o teste?

  • Olá Fernando

    Dá sim pra testar localhost, só veja se o seu firewall está liberando os acessos pro apache nas portas utilizadas

    Fabio

  • jose soarew

    Parabens Fabio!

  • Felipe Seger

    Muito bom, Fábio!
    Gostaria de saber se para enviar arquivos em anexo é necessário fazer upload do arquivo para o servidor para após isso poder enviar através do e-mail.

    Felipe.

  • Olá Felipe

    Não é necessário. Você pode informar a URL de um arquivo que está em outro servidor para enviar como anexo se quiser.

    Veja em attachment:

    https://www.codeigniter.com/user_guide/libraries/email.html

    Abraços

  • Emerson Morais

    Boa tarde Fábio,

    Segui o seu tutorial a risca, porém o envio do e-mail não está acontecendo em um servidor Windows, você poderia me dizer se tenho que fazer alguma configuração no IIS do windows pra realizar o envio de e-mails utilizando o protocolo SMTP do CI?

  • Você precisa se certificar que as portas de comunicação entre o seu servidor IIS e o servidor de e-mail do Gmail estejam liberadas. Ou seja, dê uma olhada se não há alguma regra no firewall bloqueando isto. Use também a função $this->email->print_debugger() para tentar descobrir o erro.

  • Emerson Morais

    Obrigado pela atenção Fábio,

    O problema está resolvido, tinha que autorizar as requisições no servidor de e-mail. (a aplicação está em um servidor e o servidor de e-mail está em outro).