Transmissão de Email Autenticado com PHP

PHPMailer é uma classe pronta para envio de e-mails através do PHP via conexão SMTP (autenticação) ou POP3 muito utilizado por todo o mundo. Seu método de envio é largamente recomendado e é bem melhor do que o envio do mail() que á função padrão do PHP.

Um servidor exige autenticação por razões de segurança para que o mesmo não seja identificado como um servidor de Spams.

Obs: a função mail() do PHP só funciona se o servidor de email não exigir autenticação, ou seja, não exige nome de usuário e senha.

1. Programas necessários

1.1. Faça o download, em http://sourceforge.net/projects/phpmailer/files/ ou outro site, descompacte o arquivo e coloque os arquivos class.phpmailer.php e class.smtp.php em uma pasta chamada phpmailer dentro do seu site.

Download do PHPMailer_v5.1zip (versão atual, 2012):

1.2. WampServer2.1e-x32.exe

       MySQL 5.5.8

       Apache 2.2.17

       PHP 5.3.5

       phpMyAdmin 3.3.9

Obs: para que não haja erro na execução do código fonte, é necessário a compatibilidade das versões utilizadas, uma vez que o conjunto dos programas devem ser compatíveis com o código utilizado.

2. Os arquivos têm de ser executados pelo Wamp, crie uma pasta para cada projeto no diretorio www.

3. Tópicos relacionados:

3.1. Usuário administrador, ativação do super usuário (windows vista);

3.2. Permissão de acesso a pastas e arquivos, permissões efetivas (propiredades de pastas e arquivos).

4. Configuração do servidor, no meu caso:


Esta é a configuração do meu servidor de envio de email:

Servidor de SMTP: smtps.bol.com.br
Porta de SMTP: 587
Requer conexão segura: não
Meu servidor requer autenticação: sim
Username = "seueamil@bol.com.br"
Password = "suasenha"


Configurações de recebimento de e-mail:
Servidor de POP3: pop3.bol.com.br
Porta de POP3: 995
Requer conexão segura: sim

Configurar o arquivo php.ini do wamp
Localize: smtp_port = 25
Mude para: smtp_port = 587

Configure o arquivo class.phpmailer.php
Localize var $Port = 25
Mude para var $Port = 587

A seguir serão apresentados exemplos de códigos para envio de e-mail, utilizando um arquivo para o formulário para entrada de dados e outro arquivo utilizado para captura dos dado e envio dos mesmos, sobre formulário há um capítulo próprio para ele, sugiro que consulte-o.

Dentro do arquivo (pasta) baixado PHPMailer há um manual indicando charset=iso-8859-1, portanto inclua-o no arquivo PHP e no Formulário HTML que fazem o envio dos dados. Poderá usar arquivo HTML5 (<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>) conjuntamente, pois não participa do email:


<?php
header('Content-Type: text/html; charset=iso-8859-1');
...
<form action="" method="post" enctype="multipart/form-data" accept-charset="iso-8859-1">...

Exemplo1:

Arquivo: contato.php

<?php
header('Content-Type: text/html; charset=iso-8859-1');
#inclui a classe PHPMAILER
include("phpmailer/class.phpmailer.php"); //pasta em que a classe se encontra
#instancia o objeto
$mail = new PHPMailer();
#enviar via SMTP
$mail->IsSMTP();
#seu servidor smtp / dominio no meu caso "mail" mas pode mudar verifique o seu!
$mail->Host = "smtp.bol.com.br";
#habilita smtp autenticado
$mail->SMTPAuth = true;
#usuário deste servidor smtp. Aqui esta a solucao
$mail->Username = "seuemailbol.com.br";
$mail->Password = "suasenha"; // senha
#email utilizado para o envio, pode ser o mesmo de username
$mail->From = "lucelio.moreira@bol.com.br";
$mail->FromName = "NOME DE EXIBICAO";

#Enderecos que devem receber a mensagem
$mail->AddAddress("lucelio.moreira@bol.com.br","Vendas");
$mail->AddAddress("outroEmail@SEUDOMINIO.com.br","Financeiro");
#wrap seta o tamanhdo do texto por linha
$mail->WordWrap = 50;
#anexando arquivos no email (supondo estar no mesmo diretorio)
$mail->AddAttachment("arquivo.zip");
$mail->AddAttachment("foto.jpg");
$mail->IsHTML(true); //enviar em HTML

#recebendo os dados do formulario
if(isset($_POST['nome'])){
$nome    = $_POST['nome'];
$email    = $_POST['email'];
$mensagem   = $_POST['mensagem'];
#informando a quem devemos responder. o mail inserido no formulario
$mail->AddReplyTo("$email","$nome");
#criando o codigo html para enviar no email, voce pode utilizar qualquer tag html
$msg  = "Contato Site";
$msg .= " Nome: $nome\n";
$msg .= " E-mail: $email\n";
$msg .= " Mensagem: $mensagem\n";
}

$mail->Subject = "ASSUNTO DO EMAIL";
#adicionando o html no corpo do email
$mail->Body = $msg;
#enviando e retornando o status de envio
if(!$mail->Send())
{
echo "houve um erro ao  enviar o email! erro: $mail->ErrorInfo";
#$mail->ErrorInfo informa onde ocorreu o erro, o uso opcional
exit;
}
echo "Mensagem enviada ok";
?>

Arquivo: formulario.php


<html>
<head>
<title>contato</title>
</head>
<body>
<form name="contato" id="contato" action="contato.php" method="post"
enctype="multipart/form-data" accept-charset="iso-8859-1">
<input type="text" name="nome" id="nome">
<input type="text" name="email" id="email">
<textarea name="mensagem" id="mensagem"></textarea>
<input type="submit" name="btn_enviar" id="btn_enviar" value="Enviar">
</body>
</html>
      


Clique aqui para executar o arquivo formormulario.php

Obs: o código acima está configurado para o meu servidor, logo, quem receberá a mensagem sou eu, mude as confirurações com os seus dados conforme item 4.

Exemplo 2 (e-mail com anexo):

Arquivo: form-email-um.php

<?php
 
    if(isset($_POST['acao']) && $_POST['acao'] == 'enviar'){
 
    require('resposta-email-um.php');
 
    }
 
    ?>
 
    <!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" />
 
    <title>Formul&aacute;rio de Contato</title>
 
    </head>
 
    <body>
 
    <?php
 
    if(isset($msg))
 
    echo "<p>$msg</p>";
 
    ?>
 
    <form action="" method="post" enctype="multipart/form-data"
accept-charset="iso-8859-1">
    <fieldset>
    <legend>Formulário de Cadastro</legend>
    <label>
    <span>Nome</span>
    <input type="text" name="nome" />
    </label>  <br>
    <label>
    <span>E-mail(remetente)</span>
    <input type="text" name="email" />
    </label><br>
    <label>
    <span>Titulo</span>
    <input type="text" name="titulo" />
    </label><br>
    <label>
    <span>Mensagem</span>
    <textarea name="mensagem" cols="30" rows="5"></textarea>
    </label>  <br>
    <label>
    <span>Arquivo (até 1MB)</span>
    <input type="file" name="arquivo" />
    </label>  <br>
    <input type="hidden" name="acao" value="enviar" />
    <input type="submit" value="Enviar Formulário" class="btn"/>
    </fieldset>
    </form>
    </body>
    </html>

Arquivo: resposta-email-um.php


<?php
header('Content-Type: text/html; charset=iso-8859-1');
error_reporting(0);   // com zero, com isso nenhum erro é reportado
ini_set(“display_errors”, 0 );     // com valor zero, poderia ser também true ou false, um e zero, respectivamente. O código acima fará com que o PHP não exiba nenhum tipo de erro na tela.

    $tamanho = 512000; //define o tamanho máximo do arquivo, em bytes, aqui definido em 512000 bytes, ou seja, 500KB
#inclui a classe PHPMAILER


include("phpmailer/class.phpmailer.php");
#instancia o objeto
$mail = new PHPMailer();
#enviar via SMTP
$mail->IsSMTP();
#seu servidor smtp / dominio no meu caso "mail" mas pode mudar verifique o seu!
$mail->Host = "smtp.bol.com.br";
#habilita smtp autenticado
$mail->SMTPAuth = true;
//usuário deste servidor smtp. Aqui esta a solucao
$mail->Username = "xxxxx.xxxxxx@bol.com.br";  // seu email
$mail->Password = "senha"; // sua senha do email
//email utilizado para o envio, pode ser o mesmo de username
$mail->From = "xxxx.xxxx@bol.com.br"; // seu email, destinatário
$mail->FromName = "NOME DE EXIBICAO";

#Enderecos que devem receber a mensagem
$mail->AddAddress("lucelio.moreira@bol.com.br","Vendas");
$mail->AddAddress("outroEmail@SEUDOMINIO.com.br","Financeiro");
#wrap seta o tamanhdo do texto por linha
$mail->WordWrap = 50;


$mail->IsHTML(true); //enviar em HTML

#recebendo os dados do formulario
if(isset($_POST['nome'])){
$nome    = $_POST['nome'];
$email    = $_POST['email'];
$titulo   = $_POST['titulo'];
$mensagem   = $_POST['mensagem'];
$arquivo = $_FILES['arquivo'];

#informando a quem devemos responder. o mail inserido no formulario
//$mail->AddReplyTo("$email","$nome");
#criando o codigo html para enviar no email, voce pode utilizar qualquer tag html
$msg = " Nome: $nome\n";
$msg .= "<p> E-mail: $email\n</p>";
$msg .= "<p>Titulo: $titulo\n</p>";
$msg .= " <p>Mensagem: $mensagem\n</p>";
//$msg .= "Arquivo:"$arquivo\n";
}


$mail->Subject = "ASSUNTO DO EMAIL";
#adicionando o html no corpo do email
$mail->Body = $msg;

$mail->AddAttachment($arquivo['tmp_name'], $arquivo['name']); //adiciona o anexo


#enviando e retornando o status de envio
if(!$mail->Send())
{
echo "houve um erro ao  enviar o email! erro: $mail->ErrorInfo";
#$mail->ErrorInfo informa onde ocorreu o erro, o uso opcional
exit;
}
echo "Mensagem enviada ok";
?>

Clique aqui para executar o arquivo form-email-um.php

Comentário:

O exemplo 2 serve para cadastro, envio de curículo, etc, falta apenas algumas melhorias como envio de multiplos anexo, melhorar a formatação, etc. Serão criado futuramente outros exemplo. Uma dica, no arquivo resposta-email-um.php, o email de From pode ser uma variável $_POST['campo'], onde o campo é digitado pelo usuário no arquivo form-email-um.php.