Enviar e-mails localhost com PHP e PHPMailer
No post de hoje vamos tratar de um tema muito solicitado no blog, como enviar e-mails localhost com PHP e para efetuarmos esse tarefa vamos usar a biblioteca PHPMailer.
A maioria do leitores que possui a dúvida sobre como enviar e-mails localhost, passa pela questão da existência da função nativa mail() do PHP onde passamos apenas alguns parâmetros para que nossa mensagem seja enviada.
Com isso temos a falsa impressão que basta apenas termos o PHP e o Apache instalados para podermos enviar e-mails localmente.
Por que a função mail() não funciona localmente?
A reposta é simples, a função mail() carrega as configurações do servidor SMTP a partir do arquivo php.ini, onde não é suportado passar informações como usuário e senha, temos um problema porque a maioria dos servidores SMTP (gmail, hotmail, yahoo e etc) necessitam de autenticação.
- Quando estamos trabalhando em servidores de hospedagem, os mesmos já possuem um servidor SMTP instalado e com os dados configurados no php.ini, por isso na maioria das hospedagens a função mail() funciona tranquilamente.
- Quando estamos trabalhando localmente não temos um servidor SMTP instalado em nossas máquinas, podemos até tentar configurar o php.ini para usar um servidor externo como gmail por exemplo, seria necessário passar usuário e senha, mas o php.ini não tem essa opção de configuração e nesse caso não iria funcionar.
Trabalhando com PHPMailer localmente
Agora que já conhecemos o problema da função mail() vamos a solução do problema que é usar a biblioteca PHPMailer que poder ser baixada manualmente ou utilizando o gerenciador de dependências composer.
Essa biblioteca funciona como um “wrapper” empacotando toda a complexidade para envio de e-mails e disponibilizando diversas funcionalidades básicas como autenticação, envio com cópias, anexo de arquivos e etc.
Temos alguns pré-requisitos que são necessários no servidor Apache e no PHP:
- Habilitar o módulo ssl_module no Apache
- Habilitar a extensão open_openssl no php.ini
- Habilitar a extensão php_sockets no php.ini
Observação: A maneira como são habilitados os módulos e extensões, além do caminho dos arquivos de configuração são diferentes para Linux e Windows, sugiro ao leitor pesquisar sobre o assunto.
Desbloqueando GMAIL para envio
Vou usar o servidor SMTP do GMAIL “smtp.gmail.com” (é necessário possuir conta no gmail) no script para testar o envio, possivelmente na primeira vez que o leitor tentar enviar um e-mail usando o GMAIL será exibido um erro, onde basicamente o Google bloqueia a tentativa de login por dispositivos menos seguros.
Para resolver esse problema efetue o login na sua conta e acesse a página Aplicativos menos seguros, marque a opção “Ativar”:
Testando envio de e-mail com PHPMailer
Agora podemos enviar e-mails usando GMAIL sem o problema do bloqueio, abaixo segue um script básico usando PHPMailer para enviar e-mail com destinatário “wllfl@ig.com.br”.
Para esse exemplo baixei direto do repositório oficial do PHPMailer no GitHub os arquivos da biblioteca, coloquei esses arquivos na pasta “PHPMailer” que está dentro do meu projeto, no script é só apontar o require para o caminho “PHPMailer/PHPMailerAutoload.php” com isso já podemos instanciar o objeto PHPMailer:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
<?php // Caminho da biblioteca PHPMailer require 'PHPMailer/PHPMailerAutoload.php'; // Instância do objeto PHPMailer $mail = new PHPMailer; // Configura para envio de e-mails usando SMTP $mail->isSMTP(); // Servidor SMTP $mail->Host = 'smtp.gmail.com'; // Usar autenticação SMTP $mail->SMTPAuth = true; // Usuário da conta $mail->Username = 'wllsistemas02@gmail.com'; // Senha da conta $mail->Password = 'minha_senha'; // Tipo de encriptação que será usado na conexão SMTP $mail->SMTPSecure = 'ssl'; // Porta do servidor SMTP $mail->Port = 465; // Informa se vamos enviar mensagens usando HTML $mail->IsHTML(true); // Email do Remetente $mail->From = 'wllsistemas02@gmail.com'; // Nome do Remetente $mail->FromName = 'William'; // Endereço do e-mail do destinatário $mail->addAddress('wllfl@ig.com.br'); // Assunto do e-mail $mail->Subject = 'E-mail PHPMailer'; // Mensagem que vai no corpo do e-mail $mail->Body = '<h1>Mensagem enviada via PHPMailer</h1>'; // Envia o e-mail e captura o sucesso ou erro if($mail->Send()): echo 'Enviado com sucesso !'; else: echo 'Erro ao enviar Email:' . $mail->ErrorInfo; endif; |
Resultado
Observem que recebi o e-mail com todas as informações que passei no script acima, nome e e-mail do remetente, assunto e formatação da mensagem onde utilizei tag <h1>, esse e-mail foi enviado da minha máquina.
A biblioteca PHPMailer possui vários tipos de configurações, todas elas podem ser encontradas na documentação oficial.
Todos os servidores SMTP que testei e funcionaram, seguem abaixo as configurações:
- GMAIL
- Servidor SMTP: smtp.gmail.com
- Porta: 465
- SMTPSecure: ssl
- Desbloqueio no Servidor: É necessário desbloquear no GMAIL
- YAHOO
- Servidor SMTP: smtp.mail.yahoo.com
- Porta: 465
- SMTSecure: ssl
- Desbloqueio no Servidor: Não é necessário
- HOTMAIL
- Servidor SMTP: smtp.live.com
- Porta: 587
- SMTPSecure: tls
- Desbloqueio no Servidor: Não é necessário
- IG
- Servidor: smtp.ig.com.br
- Porta: 465
- SMTSecure: ssl
- Desbloqueio no Servidor: Não é necessário
Observações: Para usar esses servidores SMTP é necessário possuir uma conta de e-mail válida em cada um deles. Todos os servidores enviaram normalmente os e-mails mas o HOTMAIL recebe a maioria das mensagens na lixeira, então não existe garantia que a mensagem chegue ao destinatário sempre na caixa de entrada.
Demo
Para o leitor que se interessar, construí um formulário básico de teste sem validações, mas é possível enviar e-mails com todos os servidores que citei acima, nesse link é possível efetuar o download ExemploPHPMailer.zip (5484 downloads) .
Bom pessoal com isso chego ao fim de mais um post, demonstrei bem resumidamente como podemos usar a biblioteca PHPMailer para enviar e-mails localmente, é claro que podemos trabalhar com ela em nossos projetos hospedados em servidores WEB, basta configurar todos os parâmetros que foram descritos no script acima adequadamente.
Até a próxima …