BotecoDigital.info

Enviando email com PHPmailer


10/01/2009 Rodrigo Aramburu 13 Comentários

, , ,

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]

Compartilhe:

  • Twitter
  • Rec6
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Blogplay
  • LinkedIn
  • Live
  • Netvibes
  • Reddit
  • Technorati
  • PDF
  • Print
  • email

Atualmente existe 13 comentários

  1. Comentário de Wellington em 09/06/2009:

    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

  2. Comentário de rodrigo em 11/06/2009:

    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

  3. Comentário de Mariana em 01/07/2009:

    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…

  4. Comentário de Rodrigo Aramburu em 01/07/2009:

    Se aparece o código PHP na tela provavelmente está faltando uma tag <?php de abertura de código PHP, da uma conferida.

  5. Comentário de Lilian Lazzarin em 23/07/2009:

    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;

  6. Comentário de Rodrigo Aramburu em 29/07/2009:

    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.

  7. Comentário de tuga em 14/10/2009:

    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?!

  8. Comentário de Rodrigo Aramburu em 14/10/2009:

    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

  9. Comentário de Alex P. em 23/11/2009:

    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

  10. Comentário de Rodrigo Aramburu em 04/05/2010:

    Só para constar.

    Para enviar um e-mail utilizando uma conta google basta trocar o host para “ssl://smtp.gmail.com:465″

  11. Comentário de Gabriel Sousa em 04/06/2010:

    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!

  12. Comentário de Paulo Victor em 29/06/2010:

    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!

  13. Comentário de Milena em 21/07/2010:

    Meo DEUS!

    Muito obrigada mesmo!
    Vc salvou o meu dia!

Deixe um comentário








Boteco Digital | Todos os direios reservados