Enviando email com PHPmailer
O formulário de contato é uma ferramenta de comunicação de extrema importância que não pode ser tratada com desdem ao se desenvolver um site. Ela é uma das tarefas primordiais da web e devido a crescente onda de spam simplesmente deixar seu endereço de e-mail na página pode ser uma grande dor de cabeça(acreditem minha pasta spam do Gmail sabe do que fala).
Veremos então como criar um pequeno formulário de contato com apenas nome, e-mail, telefone, cidade, assunto e mensagem. Vejamos como ficará o HTML então:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <form action="enviar.php" method="post"> <fieldset> <legend>Formulário de Contato</legend> <label for="nome">Nome</label> <input name="nome" size="40" type="text" /> <label for="email">E-mail:</label> <input name="email" size="40" type="text" /> <label for="telefone">Telefone</label> <input name="telefone" size="20" type="text" /> <label for="assunto">Assunto</label> <input name="assunto" size="40" type="text" /> <label for="mensagem">Mensagem</label> <textarea cols="40" rows="4" name="mensagem"></textarea> <input type="submit" value="Enviar" /> </fieldset> </form> |
Para enviar este formulário iremos utilizar uma classe PHP chamada PHPmailer(http://phpmailer.sourceforge.net/), então antes de começarmos é bom baixa-la e descomactar-la na pasta do script.
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 54 55 56 | require_once('phpmailer/class.phpmailer.php'); $erros = ""; if(empty($_POST['nome'])){ $erros .= "O nome deve ser preenchido."; } if(empty($_POST['email']) ){ $erros .= "O E-mail deve ser preenchido."; }else{ $email = $_POST['email']; eregi("([\._0-9A-Za-z-]+)@([0-9A-Za-z-]+)(\.[0-9A-Za-z\.]+)",$email,$match); if(!isset($match)){ $erros .= "O e-mail informado é inválido."; } } if(empty($_POST['mensagem'])){ $erros .= "A mensagem deve ser preenchida."; } if( empty($erros) ){ $phpmail = new PHPMailer(); $phpmail->IsSMTP(); // envia por SMTP $phpmail->Host = "mail.xxxxxx.com"; // SMTP servers $phpmail->SMTPAuth = true; // Caso o servidor SMTP precise de autenticação $phpmail->Username = "xxxxxx@xxxxxx.com"; // SMTP username $phpmail->Password = "*********"; // SMTP password $phpmail->IsHTML(true); $phpmail->From = $_POST['email']; $phpmail->FromName = $_POST['nome']; $phpmail->AddAddress("blogbotecodigital@gmail.com"); $phpmail->Subject = $assunto; $phpmail->Body .= "Nome: ".$_POST['nome'].""; $phpmail->Body .= "E-mail: ".$_POST['email'].""; $phpmail->Body .= "Telefone: ".$_POST['telefone'].""; $phpmail->Body .= "Assunto: ".$_POST['assunto'].""; $phpmail->Body .= "Mensagem: ".nl2br($_POST['mensagem']).""; $send = $phpmail->Send(); if($send){ echo "A Mensagem foi enviada com sucesso."; }else{ echo "Não foi possível enviar a mensagem. Erro: " .$phpmail->ErrorInfo; } }else{ echo $erros; } |
Vamos então commeçar a examinar o código. Na linha 1 apenas incluimos a classe PHPmailer no script. Na linha 5 testamos se a váriavel nome enviada por POST pelo nosso formulário esta vazia, se sim acrescentamos uma mensagem na variável $erros(linha 6).
Na linha 9 verficamos se o e-mail foi informado, se sim, na linha 13 utilizamos uma expressão regular para verficar se realmente foi informado um e-mail. Na linha 19 verficamos se foi enviado alguma mensagem.
Na linha 23 verficamos se não existe nenhuma mensagem de erro na variável $erros, se ela estiver vazia começa a brincadeira.
Instânciamos a classe PHPmailer na linha 25 para poder utiliza-la.
Na linha 27 definimos que utilizaremos o protocolo SMTP, poderiamos ter definido a opção $phpmail->IsMail(); que utilizaria ao invés do SMTP a função mail do PHP, mas utilizar a função mail() não é tão recomendada pois muitos servdores de e-mail pegam como spam.
Como estamos utilizando o SMTP devemos fornecer o host que enviará o email (linha 28). Na linha 29 definimos que utilizaremos autenticação para enviar o e-mail, o que também é interessante pois muitos servidores já estão utilizando este recurso para tentar diminuir o envio de spam na rede. Como definimos que iremos utilizar autenticação devemos informar o usuário e a senha, o que é feito nas linha 30 e 31.
Na linha 34 definimos que o e-mail será enviado em formato HTML.
Nas linhas 35 e 36 definimos o e-mail e nome enviado pelo formulário como remetente da mensagem, costumo fazer isto para facilitar a resposta da mensagem.
Na linha 38 adicionamos o endereço do destinatário no caso nós mensmo. A classe PHPmailer também nos permite enviar uma cópia do e-mail para outro endereço $phpmail->AddCC($endereco,$nome) e cópia oculta $phpmail->AddBCC($endereco, $nome).
Entre as linhas 39 e 44 montamos a mensagem, sendo setado o assunto $phpmail->Subject = $assunto; e montado o formulário no corpo da mensagem. Lembrando de converter as quebras de linhas \n do campo mensagem para as quebra de linha em HTML( nl2br() ).
Na linha 46 é onde nosso e-mail é enviado(ou não?). Após esta linha apenas informamos ao usuário se a mensagem foi enviada ou não. Se não for(linha 51) mostramos o erro que ocorreu.
Este é apenas um pequeno exemplo do que se pode fazer com a classe PHPMailer, ela é muito mais poderosa que isto, podemos por exemplo, enviar anexos nas mensagens.
Resumindo é isso, mas nunca é demais lembrar, que não importa quão bem feito seja o formulário, ele de nada valerá se não houver um funcionário bem treinado e rápido para atender o cliente.
Para que quiser baixar o exemplo basta clicar aqui
Paz e prosperidade
[UPDATE]
Pessoal, só para reforçar não se esqueçam de trocar o email de destino do nosso exemplo, estou recembendo bastante e-mail de teste no email do Boteco.
[/UPDATE]

Atualmente existe 13 comentários
Usei seu exemplo para enviar um e-mail local host e deu o seguinte erro .
Warning: fsockopen() [function.fsockopen]: php_network_getaddresses: getaddrinfo failed: Este host n�o � conhecido. in C:\wamp\www\PHPmailer\phpmailer\class.smtp.php on line 122
Warning: fsockopen() [function.fsockopen]: unable to connect to mail.gmail.com:25 (php_network_getaddresses: getaddrinfo failed: Este host não é conhecido. ) in C:\wamp\www\PHPmailer\phpmailer\class.smtp.php on line 122
Não foi possível enviar a mensagem. Erro: Language string failed to load: connect_host
Cara se não me engano para o gmail precisa utilizar uma conexão SSL/TLS
Tenta isso:
$mail->Host = “smtp.gmail.com”;
$mail->SMTP_PORT = “587″;
// ajusta a porta de smt a ser utilizada. Neste caso, a 587 que o GMail utiliza
$mail->SMTPSecure = “tls”;
// ajusta o tipo de comunicação a ser utilizada, no caso, a TLS do GMail
se não me engano deve funcionar
Coloquei seu exemplo no meu site, mas não deu certo.
Não recebo o e-mail, e quando clico no botão enviar aparece parte do codigo na tela:
IsSMTP(); // envia por SMTP $phpmail->Host = “smtp.gmail.com”; // SMTP servers $mail->SMTP_PORT = “587″; $mail->SMTPSecure = “tls”; $phpmail->SMTPAuth = false; // Caso o servidor SMTP precise de autenticação $phpmail->IsHTML(true); $phpmail->From = $_POST['email']; $phpmail->FromName = $_POST['nome']; $phpmail->AddAddress(“marianasalessilva@gmail.com”); $phpmail->Subject = $assunto; $phpmail->Body .= “Nome: “.$_POST['nome'].”"; $phpmail->Body .= “Endereço: “.$_POST['endereco'].”"; $phpmail->Body .= “E-mail: “.$_POST['email'].”"; $phpmail->Body .= “DDD: “.$_POST['ddd'].”"; $phpmail->Body .= “Telefone: “.$_POST['telefone'].”"; $phpmail->Body .= “Assunto: “.$_POST['assunto'].”"; $phpmail->Body .= “Mensagem: “.nl2br($_POST['mensagem']).”"; $send = $phpmail->Send(); if($send){ echo “A Mensagem foi enviada com sucesso.”; }else{ echo “Não foi possível enviar a mensagem. Erro: ” .$phpmail->ErrorInfo; } }else{ echo $erros; } ?>
Precisa ter um servidor de e-mail instalado?
Vlw…
Se aparece o código PHP na tela provavelmente está faltando uma tag <?php de abertura de código PHP, da uma conferida.
Olá…usei o seu exemplo em um formulário. Acredite como localhost o formulario foi enviado. Quando coloquei os arquivos no ftp da pagina…da o seguinte erro quando clico em enviar o formulario:
Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ‘}’ in /home/horizont/public_html/phpmailer/class.phpmailer.php on line 44
Verifiquei a linha o que aparece é o seguinte:
public $Priority = 3;
Enfrentei um problema parecido há algum tempo atrás, se não me engano era porque o servidor que hospedei possuia o “PHP 4″ que não aceita o comando public, a classe PHPmailer foi desenvolvida para o “PHP 5″, se não me engano se tirar os “public” e “private” da classe ela teve funcionar.
tenho um problema, o mail recebido aparece cacteres di tipo “é”.. alguem me ajuda?! sei k tem haver com a codificação do header mas o class nao dá para alterar o header?!
Verifica se se você esta salvando o arquivo na mesma codificação ou a codificação que seu servidor está mandando. Se for o caso você pode mudar pela funcão:
header(‘Content-Type: text/html; charset=iso-8859-1′);
ou
header(‘Content-Type: text/html; charset=utf8′);
ela modifica o header a ser mandado para o navegador.
Se não funcionar substitua seus acentos e caracteres especiais pelo código HMTL é o mais correto de ser feito
trabalho com PHPMailer a Bom tempo.
e vou falr alguns posiveis ERROS.
- Os arquivos class.smtp.php e class.phpmailer.php devem estar na mesma PASTA.
- Verifique si o servidor precisa SSL com Gmail
- Verifique se o Valor $phpmail->Username esta valido sem acentos, etc..
- Verifique se o servidor de SMTP esta certo.
- verifique se a PORTA é a certa.
- o Gmail usa SSL por tanto tambem usa outra PORTA
- Versão do PHP se for 4 ou 5
Só para constar.
Para enviar um e-mail utilizando uma conta google basta trocar o host para “ssl://smtp.gmail.com:465″
Cara…
muitíssimo obrigado.
Passei a tarde de hoje procurando algum email de enviar formulário autenticado, porque o servidor que eu trabalho bloqueou o uso da função mail().
Eu devo ter seguido mais de 5 tutoriais, que não estavam dando certo… li em fóruns, sites, blogs, tudo quanto é lugar, e só dava errado.
Até que achei o seu.
Bati o olho nele e tive a certeza de que funcionaria.
E funcionou.
Muito bom trabalho, e mais uma vez, obrigado!
Cara, programo em php faz 4 meses, e sua explicação quando ao uso da classe PHPMAILER foi a melhor. Objetiva.
Pessoas como você contribuem o desenvolvimento dessa linguagem no nosso país!
Valeu mais uma vez!
Meo DEUS!
Muito obrigada mesmo!
Vc salvou o meu dia!