Boteco Digital

Enviando email com PHPmailer

10/01/2009
Rodrigo Aramburu

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:

<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.

  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.
%0


, , ,

Atualmente existe 31 comentários

  1. Wellington 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. rodrigo 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. Mariana 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. Rodrigo Aramburu 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. Lilian Lazzarin 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. Rodrigo Aramburu 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. tuga 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. Rodrigo Aramburu 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. Alex P. 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. Rodrigo Aramburu 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. Gabriel Sousa 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. Paulo Victor 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. Milena 21/07/2010:

    Meo DEUS!

    Muito obrigada mesmo!
    Vc salvou o meu dia!

  14. Marcio 09/09/2010:

    Rodrigo, eu estava há dois dias tentando resolver essa mensagem: “Não foi possível enviar a mensagem. Erro: Language string failed to load: connect_host” e foi somente aqui que encontrei a resposta que foi trocar o Host de “smtp.gmail.com” para “ssl://smtp.gmail.com:465″,
    Valeu, muito obrigado!!!

  15. Júlia Fernandes 23/12/2010:

    Rodrigo! Muuuuuuuuuuuuuito obrigada, viu?
    Aprendi um bocado com esse artigo, e pretendo ler todos os outros.

    Forçaê! E escreva mais…rsrs… o/

    Vou Twittar teu tutorial. *.*

  16. Gleyson Sena 07/01/2011:

    Estou precisando configurar meu sistema para envio de e-mail usando SMTP do Gmail e não esta funcionando. Todas essas configurações acima já foram testadas e nada. O problema maior é o seguinte, configurei o Windows Live Mail para acessar a conta do GMAIL e esta funcionando, envio e recebo emails normalmente. As configurações que estão lá são:
    Servidor de Entrada: pop.gmail.com – Porta 995
    Servidor de Saida: smtp.gmail.com – Porta 465
    Fazer logon usando autenticação de texto não criptografado
    Servidor Requer autenticação
    Requer uma conexão segura (SSL) marcado para Envio/Recebimento

  17. Gleyson Sena 07/01/2011:

    Continuando…
    Minhas configurações em PHP.INI são:
    [mail function]
    ; For Win32 only.
    ; http://php.net/smtp
    SMTP = smtp.gmail.com

    ; http://php.net/smtp-port
    smtp_port = 465

    ; For Win32 only.
    ; http://php.net/sendmail-from
    ;sendmail_from = credicope@gmail.com

    ; For Unix only. You may supply arguments as well (default: “sendmail -t -i”).
    ; http://php.net/sendmail-path
    ;sendmail_path =

    A opção de extensão php_opnessl esta habilitada.
    O módulo ssl_module no Apache esta habilitada
    Estou usando a versão 2.0 do WAMPSERVER com Windows 7

  18. Gleyson Sena 07/01/2011:

    Continuando.. Este é meu arquivo PHP que uso pra enviar minhas mensagens e que não estão dando certo:

    if( empty($erros) ){

    $phpmail = new PHPMailer();

    $phpmail->IsSMTP(); // envia por SMTP
    $phpmail->Host = “smtp.gmail.com”; // SMTP servers
    $phpmail->Port = 465; // SMTP Port servers
    $phpmail->SMTPSecure = “ssl”;
    $phpmail->SMTPAuth = true; // Caso o servidor SMTP precise de autenticação
    $phpmail->Username = “credicope@gmail.com”; // SMTP username
    $phpmail->Password = “756304700″; // SMTP password
    $phpmail->SMTPDebug = 1; // SMTP Debug
    $phpmail->Timeout = 160; // SMTP Time Out

    $phpmail->IsHTML(true);
    $phpmail->From = $_POST['email'];
    $phpmail->FromName = $_POST['nome'];

    $phpmail->AddAddress(“gleyson.sena@sicoobcredicope.com.br”,”Gleyson Sena”);
    $phpmail->Subject = “Envio de email com PHPmailer”;
    $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;
    }

    Por favor me ajudem…

  19. Gleyson Sena 07/01/2011:

    Continuando… Este é meu código php
    if( empty($erros) ){

    $phpmail = new PHPMailer();

    $phpmail->IsSMTP(); // envia por SMTP
    $phpmail->Host = “smtp.gmail.com”; // SMTP servers
    $phpmail->Port = 465; // SMTP Port servers
    $phpmail->SMTPSecure = “ssl”;
    $phpmail->SMTPAuth = true; // Caso o servidor SMTP precise de autenticação
    $phpmail->Username = “credicope@gmail.com”; // SMTP username
    $phpmail->Password = “*******”; // SMTP password
    $phpmail->SMTPDebug = 1; // SMTP Debug
    $phpmail->Timeout = 160; // SMTP Time Out

    $phpmail->IsHTML(true);
    $phpmail->From = $_POST['email'];
    $phpmail->FromName = $_POST['nome'];

    $phpmail->AddAddress(“gleyson.sena@sicoobcredicope.com.br”,”Gleyson Sena”);
    $phpmail->Subject = “Envio de email com PHPmailer”;
    $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;
    }

    Por favor me ajudem…

  20. Gleyson Sena 07/01/2011:

    Esse é o Erro que ocorre:

    SMTP -> ERROR: Failed to connect to server: php_network_getaddresses: getaddrinfo failed: Este host não é conhecido. (0)
    SMTP Error: Could not connect to SMTP host. Não foi possível enviar a mensagem. Erro: SMTP Error: Could not connect to SMTP host.

  21. vitor 28/01/2011:

    Parabéns! Tudo funcionando!

  22. mario 01/04/2011:

    Opa, boa noite estou configurando e esta dando erro de conexao
    unable to connect to ssl://smtp.gmail.com:465 (connection time out)
    Erro ao conectar

  23. Eltern de Assis 12/04/2011:

    @mario, verifique se o firewall de seu servidor esta com a porta “465″ aberta. Consulte isso com o administrador da rede.

  24. Daniel 11/08/2011:

    Eita! Funcionou! Incrível pois eu estava há semanas tentando fazer dar certo.
    Agora o desafio é conseguir colocar uma função para anexar um arquivo na mensagem. No caso é um CV para RH então a pessoa deverá anexar seu CV em doc……

    como fazer isto??????

    Abs!
    Daniel

  25. CLEITON 10/09/2011:

    E pra colocar uma lista de email no campo destinatario como faz???

    Obrigado pelo post

    vlw

  26. Jeferson 12/09/2011:

    Boa noite Rodrigo! Tenho uma pergunta um tanto qanto diferente, mas relacionado ao assunto. Quando fazemos um arquivo x.php que este é o que será usado para o envio e o outro y.php onde se encontra toda configuração, “script” de envio pelo PHPMailer, certo?
    Como podemos nos garantir que um usuário mais sáfo em internet, analize o códido da página, veja a relação entre o envio e o script (onde contem usuário e senha do mail autenticador) e a robe usando para outros fins? Sei que isso é segurança de redes, mas estou passando por esse dilema e gostaria que se possível você desse uma explicação.
    Vou Colocar um ambiente para termos pontos de referências: S.O. – Linux / Web Server – Apache. Sei que daria para fazer uma configuração no apache para que não fosse editável esse script, mas é um trabalho e tanto para isso e imagine um site de uma pizzaria? Já pensou se eles iriam pagar por um serviço de segurança de redes? Seu próprio site?

    Abraços!
    Jeferson

  27. Edinelson 16/09/2011:

    Pessoal, vocês Realmente são nota 10!!!
    Minha hospedagem é do UOLHOST(#arrependidoateaalma), e não deixa eu enviar e-mail de jeito nenhum, quer dizer agora ta deixando graças a ajuda de vocês! Testei vários códigos e meios de enviar os e-mails mas nenhum havia funcionado. TKS!!!

  28. Marco Rossi 28/09/2011:

    Bom dia. Estou fazendo um sistema de envio de email, para o envio de email marketing. Nele eu fiz um while(){} para executar varias veses o envio. Gostaria de saber se ao invés do while(){} teria como eu enviar o mesmo email para varias pessoas através do PHPMailer? Como se fosse quando mandamos um email através de um web mail. E escrever uma mensagem e na função AddAddress() colocar mais de um destinatario.

    EXE, quero enviar mensagens para o joao, pedro, emerson, lucas: $phpmail->AddAddress(“joao@gmail.com;pedro@gmail.com;emerson@gmail.com;lucas@gmail.com”);

    Teria como fazer algo deste tipo com a classe PHPmailer?

  29. Rodrigo Aramburu 28/09/2011:

    Marco Rossi, tente ass.im:

    $phpmail->AddAddress(“joao@gmail.com”);
    $phpmail->AddAddress(“pedro@gmail.com”);
    $phpmail->AddAddress(“lucas@gmail.com”);
    $phpmail->AddAddress(“emerson@gmail.com”);

    mas se você for fazer uma news eu recomendo por while, pois no método acima todos os emails irão aparecer no campo “para” do email, acredito que seus clientes não iram gosta!

  30. Daniel 14/10/2011:

    Rodrigo, estou tentando trocar a mensagem de enviado com sucesso” ($msg = ‘Sua Mensagem foi enviada com sucesso!!!!!’;) pelo carregamento de uma página do site, para que o usuário não seja induzido a sair do site quando envia uma mensagem.

    Como faço isso????

    Pode-se simplesmente trocar o $msg = ‘Sua Mensagem foi enviada com sucesso!!!!!’; pelo carregamento de alguma página do tipo: pagina.html ????

    Obg!

  31. Vítor 31/10/2011:

    Sinto que este código resolverá meu problema. Ainda mais percebendo que a maioria aí alcançou sucesso. Mas ainda estou esbarrando na mensagem: “Could not connect to SMTP host.”.

    Uso Wampserver com Apache Version: 2.2.6, PHP Version: 5.2.5. Pretendo enviar e-mails em massa, com a possibilidade de bco e anexos, diretamente do meu localhost, usando um e-mail do Gmail.

    Há como me dar uma ajuda para fazer funcionar? Tenho uma certa urgência nisso.

    Grato!

Deixe um comentário