Envio De Email Através De SMTP Com PHPMailer

Quem já sofreu com o recebimento de um vírus por email, sabe que o spam é um problema cada vez maior, que causa prejuízos frequentes às empresas. Os spammers sempre reagem a novos filtros e métodos de combate, o que torna necesário uma constante vigilância nos Servidores.

Aproveitando-se deste tipo de problema, várias empresas que trabalham com Internet estão montando Servidores próprios para que seus clientes comprem pacotes diferenciados de serviço para envio de mensagens em massa.

Claro, você já sabe que isso acontece, mas… e se você tiver a necessidade de enviar um “simples” email marketing a seus clientes? Terá de pagar para fazer isso? Na mensagem de hoje falaremos sobre uma alternativa que pode ser usada para facilitar suas atividades.

SMTP Com PHPMailer

Bloqueio Da Função Mail Do PHP

Hoje 90% dos programadores que precisam enviar informações por meio de seus formulários, utilizam a função “mail” do PHP (conforme exemplo a seguir).


mail("EMAIL QUE RECEBERÁ A MENSAGEM", "ASSUNTO", "MENSAGEM", "$header");

Para uso de Formulário, não há problema algum, pois os recursos usados são mínimos.

A maior dificuldade se dá quando você precisa enviar mensagens a seus clientes ou quando os Servidores bloqueiam a função “mail”!

Se você usa a função “mail” em seus sites e passa por isso, certamente você tem um problema, pois esse tipo de estratégia dos Servidores prejudicam seus serviços.

Hoje existem vários sistemas já prontos na Internet onde você pode usar para implementar suas soluções!

Veja abaixo e faça suas adaptações!

Como Usar O PHPMailer

Uma das soluções encontradas na Internet é o PHPMailer, entre várias outras soluções que tem recursos diversos para lhe ajudar no dia a dia.

Infelizmente, várias versões dão erro com facilidade e para evitar transtorno, criamos um exemplo prático de uso que você pode adaptar para sua conta de email.

Fique tranquilo. Agora você poderá resolver seu problema facilmente.

Veja esse formulário que preparamos; ele tem os campos pré-definidos, tudo certinho (conforme o exemplo a seguir).


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link type="text/css" rel="stylesheet" media="screen" href="estilo.css">
<script src="scripts/ajax.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
function enviar_formulario()
{

  String.prototype.trim = function()   {  return this.replace(/^\s+|\s+$/g,""); }
  String.prototype.ltrim = function()  {  return this.replace(/^\s+/,""); }
  String.prototype.rtrim = function()  {  return this.replace(/\s+$/,""); }

  if( document.getElementById("empresa").value.trim() == '' ){
    document.getElementById("empresa").focus();
    alert( "Preencher campo Empresa !" );    
    return false
  }
  else if( document.getElementById("pessoa_contato").value.trim() == '' ){
    document.getElementById("pessoa_contato").focus();
    alert( "Preencher o campo Pessoa de Contato !" );
    return false
  }
  else if( document.getElementById("telefone").value.trim() == '' ){
    document.getElementById("telefone").focus();
    alert( "Preencher o campo DDD+Telefone !" );
    return false
  }
  else if( document.getElementById("email").value.trim() == '' ){
    document.getElementById("email").focus();
    alert( "Preencher o campo E-mail !" );
    return false
  }  
  else if( document.getElementById("email").value.trim() != '' ){
    
    var er = new RegExp(/^[A-Za-z0-9_\-\.]+@[A-Za-z0-9_\-\.]{2,}\.[A-Za-z0-9]{2,}(\.[A-Za-z0-9])?/);
    var mail = document.getElementById("email").value;
    var valida_mail = 0;
    
    if(typeof(mail) == "string"){
      
      if(er.test(mail)){
        valida_mail = 1;
      }        
    
    } else if(typeof(mail) == "object"){
      if(er.test(mail.value)){
           valida_mail = 1;
      }
    }else{
        valida_mail = 0;
    }
    
    if( valida_mail == 0 ){
      document.getElementById("email").focus();
      alert( "Preencher o campo E-mail corretamente !" );
      return false
    }  
    else{

      if( document.getElementById("assunto").value == 0 ){
        document.getElementById("assunto").focus();
        alert( "Preencha o campo Assunto !" );
        return false
      }
    }
  }
}

</script>
<title>Contatos</title>
</head>
<body>
<div>
  <form action="formulario_envia.php" method="post"  name="contato" onsubmit="return enviar_formulario()">
    
    <!-- Inicio da Tabela -->
    <table width="700" border="0" align="center" background="imagens/background_formulario.png">
      <tr>
        <td colspan="4"><br>
          <div id="titulo">Preencha o Formulário de Contato</div>
          <br>
        </td>
      </tr>
      <tr>
        <td><label id="lb_empresa">Empresa:</label></td>
        <td><input name="empresa" type="text" id="empresa" maxlength="50"></td>
        <td><label>Pessoa de Contato:</label></td>
        <td><input name="pessoa_contato" type="text" id="pessoa_contato" maxlength="30">
        </td>
      </tr>
      <tr>
        <td><label>DDD+Telefone:</label></td>
        <td><input name="telefone" type="text" id="telefone" maxlength="15"></td>
        <td><label>Telefone Alternativo:</label></td>
        <td><input name="telefone_alternativo" type="text" id="telefone_alternativo" maxlength="15"></td>
      </tr>
      <tr>
        <td><label>Email:</label></td>
        <td><input id="email" name="email" type="text">
        </td>
        <td><label>Assunto:</label></td>
        <td><input name="assunto" type="text" id="assunto" maxlength="50">
        </td>
      </tr>
      <tr>
        <td><label>OBSERVAÇÕES:</label></td>
        <td colspan="3"><textarea name="observacao" rows="5"></textarea></td>
      </tr>
      <tr>
        <td colspan="4"><div align="right"><input type="image" src="imagens/bt_solicitacao.png" name="solicitacao" alt="Enviar" id="botao" />
          </div></td>
      </tr>
    </table>
  </form>
</div>
</body>
</html>

Veja que ele transfere seu conteúdo para o ficheiro “formulario_envia.php”. É nesse ficheiro que faremos as configurações!

Exemplo:



<?php
session_start();
setlocale(LC_CTYPE,"pt_BR");
function sendMail($para,$de,$mensagem,$assunto){
//DADOS SMTP
$smtp    = "empresasnainternet.com.br"; //      < ---- Alterar o smtp
$usuario = "teste@empresasnainternet.com.br"; //      < ---- Alterar o email
$senha   = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //      < ---- Alterar a senha
// NAO ALTERAR
require_once 'smtp/smtp.php';
$mail = new smtp;
$mail->Delivery('relay');
$mail->Relay($smtp, $usuario, $senha, 465, 'login', true);
$mail->TimeOut(10);
$mail->Priority('high');
$mail->From($de);
$mail->AddTo($para);
$mail->Html($mensagem);
  if($mail->Send($assunto)){

    //echo "MENSAGEM ENVIADA COM SUCESSO";
    $_SESSION['feedback'] = "MENSAGEM ENVIADA COM SUCESSO";
    header ("Location: index.php");
    //return true;
  }else {

    //echo "MENSAGEM FALHOU AO SER ENVIADA, TENTE MAIS TARDE";
    $_SESSION['feedback'] = "MENSAGEM FALHOU AO SER ENVIADA, TENTE MAIS TARDE";
    header ("Location: index.php");
    //return false;
  }
}

  // Recebe os valores mandado pelo formulario
  $empresa        = $_POST['empresa'];
  $pessoa_contato = $_POST['pessoa_contato'];
  $telefone       = $_POST['telefone'];
  $telefone_alternativo = $_POST['telefone_alternativo'];
  $email          = $_POST['email'];
  $assunto        = $_POST['assunto'];
  $observacao     = $_POST['observacao'];
  
// Variavel guarda todo o html com a informações que será o corpo do email
$corpo='
<html>
<head>
<title>Contato</title>
</head>
<body>
  <table width="700" border="1">
      <tr>
        <td><label id="lb_empresa">Empresa:</label></td>
        <td>'.$empresa.'</td>
        <td><label>Pessoa de Contato:</label></td>
        <td>'.$pessoa_contato.'</td>
      </tr>
      <tr>
        <td><label>DDD+Telefone:</label></td>
        <td>'.$telefone.'</td>
        <td><label>Telefone Alternativo:</label></td>
        <td>'.$telefone_alternativo.'</td>
      </tr>
      <tr>
        <td><label>Email:</label></td>
        <td>'.$email.'</td>
        <td><label>CEP:</label></td>
        <td>'.$assunto.'</td>
      </tr>
      <tr>
        <td><label>OBS:</label></td>
        <td colspan="3">'.$observacao.'</td>
      </tr>
    </table>
</body>
</html>';

// Chama a função para enviar o email.
// Ex: sendMail("Email que recebe","Email que envia","Corpo do email","Titulo do email");
sendMail($email,"atendimento@empresasnainternet.com.br",$corpo,'Formulário de Contato'); // < ---- Alterar os dados de envio do email

?>

Veja que em parte do trecho, disponibilizei a mensagem: “não alterar”. Mas essa mensagem é justamente para quem não conhece nada de configuração!

OBSERVAÇÕES:

No ficheiro acima,você pode ver que existem algumas linhas comentadas, correto?

Elas descrevem as configurações necessárias e explicam o que você pode fazer.

O trecho mais importante é onde aparece a informação a seguir:


$mail->Relay($smtp, $usuario, $senha, 465, 'login', true);

Veja que aparece o número 465, correto?

Esse é o número da Porta usada no Sistema!

Muitos administradores tem problemas, pois os Web Servers (principalmente Linux) vem com a Porta 25 bloqueada, impossibilitando qualquer envio.

No Linux essa será a porta usada e dificilmente dará problema.

Agora você pode fazer adaptações!

Bem… o ficheiro acima está em anexo e poderá ser melhorado de acordo com sua necessidade!

Observações

Existem alguns erros que podem ocorrer, por isso é bom alertar:

  • Aparece o erro Warning: fsockopen() [function.fsockopen]: unable to connect to seusite.com.br: Este erro ocorre, pois os dados de acesso não estão corretos ou o Servidor não libera o acesso. Verifique se seu Servidor bloqueia as portas SMTP (25, 465 ou 587) para visualização de Servidor externo.
  • Aparece o erro 535 authorization failed (#5.7.0)”: Se você tentou usar o Yahoo, GMail ou outro Programa de envio e recebimento de email e ele negou é pq o seu e-mail não esta permitindo acesso pop3 nem smtp. Para isto vc deve efetuar as configurações devidas diretamente no Servidor para corrigir o problema.
  • Só para reforçar: Não esqueça de alterar os dados de acesso e os emails destinatários, para que as mensagens não sejam enviadas à minha caixa e sim a você.

Bem… Espero que tenham entendido o script e usem em suas soluções.

Download do código usado neste tutorial: Envio De Email Com Autenticação Através Do PHPMailer

Be Sociable, Share!

11 Comentários

  1. Sim. Tudo beleza.
    Mas como e onde eu coloco esse arquivos para que eles sejam chamados pelo meu site e possam remeter o emial ?

    • No tutorial, a primeira parte do código é um formulário. É essa parte que você tem que integrar no seu site. Você sabe HTML? Quando alguém aceder a esse formulário, os restantes ficheiros vão processar o envio da informação. Você tem que alterar no ficheiro formulario_envia.php os dados que o autor do tutorial, Quemuel Aquino, indica que você precisa de alterar. Tem que alterar o smtp server, o username da conta de email e a senha. E também o email para onde é enviada a informação. Este é apenas um exemplo de como pode ser usado o PHPMailer. Rui Soares

  2. Gustavo Castelo

    Olá Quemuel Aquino,
    gostei muito do seu tutorial, porém, na pressa de testá-lo, esqueci de fazer as alterações devidas e acabei enviando uns 2 ou 3 e-mails para você, peço desculpas por isso. Fiz as devidas alterações e deu tudo certo.
    Parabéns e obrigado.

  3. webtutoriais

    Boas! o tutorial parece ser muito bom!
    Mas comigo nao funciona! 
    Eu axo que o erro ta no mail, palavrapass, e servidor, o que coloco o servidor?
    MAs e preciso registar no site do servidor?

  4. halan

    Olá. Bem, primeiramente quero parabenizar pelo tutorial, muito bom.
    Tenho uma dúvida, se alguém puder me ajudar ficaria muito grato.
    É o seguite, acrescentei no formulário_envia mais um sendMail com o intuito de enviar uma auto resposta para usuário — sendMail($email, 'nome@dominio.com.br', $corpo, 'Formulário de Contato') — funciona perfeitamente. O único problema é com emails do hotmail que recebem a auto resposta, mas não envia os dados do formulário para nome@dominio.com.br. O que pode estar acontecendo.
    Desde já agradeço.

  5. Andre Totslaw

    Prezado Quemuel,
    como faço para usar este código para envio de email no worpress?

    Grato

  6. kelsen

    Quemuel vc me salvou, tentei tudo quanto é formulario php e em nenhum consegui fazer funcionar, o seu ficou uma maravilha e consegui adaptar ao meu site. Vlw demais!

  7. Nuno Soares Dias

    Muito bom, muito obrigado, é pena servirem-se do seu post e adicionarem informações erradas. Mais uma vez obrigado.

  8. Fagner

    Muito bom seus tutoriais mais aconteceu esse erro:  
    PHP Warning:  fsockopen() [function.fsockopen]: SSL operation failed with code 1. OpenSSL Error messages:
    error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number in E:homeartweblastWebficheiros contatosmtpsmtp.php on line 623
    PHP Warning:  fsockopen() [function.fsockopen]: Failed to enable crypto in E:homeartweblastWebficheiros contatosmtpsmtp.php on line 623
    PHP Warning:  fsockopen() [function.fsockopen]: unable to connect to tls://200.147.36.31:587 (Unknown error) in E:homeartweblastWebficheiros contatosmtpsmtp.php on line 623

  9. Chris

    Olá, 

    Como eu faria para pegar valores do form que está em loop buscando varios linhas da tabela do banco.
    ex: <input id="<?php echo 'VALORPROD'.$cont?>

    eu fiz assim $VALORPROD  = $_POST['VALORPROD'];
    e não funcionou

  10. jose soare

    muito bom,
    Parabens pelo post

    amigo, agora estou precisando capturar a lista de emails ainda nao lidos do gmail… para notificar ao usuario que tem emails na caixa de entrada… eh possivel com phpmailer?
    se puder me ajudar… aguardo

    parabens

Participa! Comenta... para Gustavo Castelo