Como fazer um formulário que envie por email autenticando no smtp?

Adicionar artigo ao Rec6
Adicionar artigo ao Linkk
Adicionar artigo ao doMelhor
Adicionar artigo ao Eu Curti
Adicionar artigo ao del.icio.us

Esse tutorial é meio longo, mas vale a pena. É algo que todo mundo sempre quer. A maioria dos scripts que rolam pela internet não autentica no SMTP, enviando as mensagens como nobody. Porém, alguns provedores de email simplesmente consideram SPAM todos esses e-mails e você acaba não recebendo nada. Em outros casos o problema está com o provedor de hospedagem, que por questões de segurança, eles corretamente não permitem tal envio anônimo. Bem, vamos direto ao assunto!

Você precisará de quatro arquivos:

  1. formulario.html - um arquivo html com um formulário simples
  2. mail.php - aqui está a função enviamail
  3. envia_form.php - esse arquivo recebe os dados do formulário e possui dados de configuração do smtp
  4. sucesso.html - página para onde o usuário será redirecionado após um envio com sucesso

Uma descrição detalhada, e link para download deles estão

Obviamente todos os arquivos poderiam estar em um único. Ou pelo menos os dois .php, mas preferi deixá-los separados por oganização.

Vamos criar o formulario.html (lembre-se, ele está disponível para download no final do post. Não há necessidade de copiar/colar o conteúdo de cada arquivo). Um formulário simples html. O meu eu fiz assim:

<form action=”envia_form.php” method=”post”>

<table>
<tr>
<td align=”center”>Nome:</td>
<td><input type=”text” name=”nome” /></td>
</tr>

<tr>
<td align=”center”>Assunto:</td>
<td><input type=”text” name=”assunto” /></td>
</tr>

<tr>
<td align=”center”>Email:</td>
<td><input type=”text” name=”mail” /></td>
</tr>

<tr>
<td align=”center”>Mensagem:</td>
<td>
<textarea name=”mensagem” cols=”47″ rows=”5″></textarea></td>
</tr>

<tr>
<td colspan=”2″ align=”center”><input class=”botao” type=”submit” value=”Enviar Contato” /></td>
</tr>

</table>
</form>

E depois joguei um CSSzinho em cima pra ficar mais agradável. Procurei usar o máximo de apetrechos possíveis, mas obviamente, você não precisa fazer um form tão apapagaiado.

<style type=”text/css”>
<!–

body {
font: 12px verdana, arial, helvetica, sans-serif;
}
input,textarea {
background-color: #EEE9E9;
border:1px solid #5F9EA0;
color:#2F4F4F;
font: 12px verdana, arial, helvetica, sans-serif;
width: 200px;
}

input.botao {
width : 130px;
}

input:focus, textarea:focus, input.botao:hover {
background-color: #F5F5F5;
color:#1E90FF;
}

tr {
background-color: #F5F5F5;
color:#2F4F4F;
}

tr:hover {
background-color: #F0F8FF;
}

–>
</style>

Agora vamos criar o mail.php. É a principal parte do código. Ela possui a função enviamail que não foi desenvolvida por mim, apenas dei uma adaptada. Não coloco os créditos pois simplesmente não sei quem desenvolveu. Já achei sem créditos.

Há um que detalhe de configuração deve ser observado. Podemos configura-lo para informar o email que o usuário nos passou como endereço do remetente. Essa opção é claramente a mais prática, pois ao responder normalmente um email o endereço do destinatário já estará lá corretamente. Porém, dependendo do email informado pelo usuário e das configurações do servidor de email que você utiliza para receber os contatos, algumas mensagens poderão ser confundidas com email falsas e consideradas SPAM ou simplesmente descartadas. Cabe a você escolher entre a comodidade de receber as mensagens com o email de quem lhe procurou no campo De ou a segurança de receber todas as mensagens. No meu eu preferi a praticidade, mas mostrarei os dois caminhos. Eis o meu mail.php

function enviamail($smtp_sistema,$porta_smtp,$email,$login_smtp,$senha_smtp,$assunto,$leitura,$deNome,$email_remetente)
{
$timeout = 10;
/**
* Caso deseje tenha problemas no recebimento de mensagens, descomente a linha 9 e comente a 10
*/
//$de = $login_smtp;
$de = $email_remetente;

$para = $email ;
$assunto = $assunto;
$data = ‘Date: ‘.date(’r',time()); // Não altere em hipótese alguma
$paraNome= $para ;
$corpo = $leitura ;
$smtp = @fsockopen($smtp_sistema, $porta_smtp, $errno, $errstr, $timeout);

if ($errno){
echo “Erro ao conectar ao $servidor na $porta_smtp: “.rawurlencode($errstr);
return 0;
exit;
}

$resp = ” ;
fputs($smtp,”EHLO $smtp_sistema\r\n”, 512);
fputs($smtp,”AUTH LOGIN\r\n”, 512).”<br>”;
$resp.= “auth login: “.fgets($smtp, 512).”<br>”;
fputs($smtp,base64_encode($login_smtp).”\r\n”, 512).”<br>”;
$resp.= “login: “.fgets($smtp, 512).”<br>”;
fputs($smtp,base64_encode($senha_smtp).”\r\n”, 512).”<br>”;
$resp.= “senha: “.fgets($smtp, 512).”<br>”;
// estabelece um email de retorno para receber msgs de erro
fputs($smtp, “MAIL FROM:<$de>\r\n”, 512);
$resp.= “mail from: “.fgets($smtp, 512).”<br>”;
// estabelece o endereço de envio
fputs($smtp, “RCPT TO:<$para>\r\n”, 512);
$resp.= “recpt to: “.fgets($smtp, 512).”<br>”;
$resp.= “$email — <br>”;
// comanda o inicio do email a ser enviado
fputs($smtp, “DATA\r\n”, 512);
$resp.= “data: “.fgets($smtp, 512).”<br>”;
// infomações do email a ser enviado
fputs($smtp, “MIME-Version: 1.0\r\n”);
fputs($smtp, “Content-Type: text/html; charset=iso-8859-1\r\n”);
fputs($smtp, “Date: $data\r\n”);
fputs($smtp, “From: $deNome <$de>\r\n”);
fputs($smtp, “To: $paraNome <$para>\r\n”);
fputs($smtp, “Subject: $assunto\r\n”);
fputs($smtp, “\r\n”);
fputs($smtp, “$corpo\r\n.\r\n”);
$resp.= “email: “.fgets($smtp, 512).”<br>”;
// encerra a conexão com o servidor
fputs($smtp, “QUIT\r\n”, 512);
$resp.= “quit: “.fgets($smtp, 512).”<br>”;

fclose($smtp);
return 1;
}

Lembro que esse formulário não garante o recebimento de todas as mensagens, especialmente se o usuário informar um email errado. Para garantir o recebimento você deve trocar o comentário das linhas 9 e 10

//$de = $login_smtp;
$de = $email_remetente;

Deverá ser

$de = $login_smtp;
//$de = $email_remetente;

Vamos ao envia_form.php. Ele requer algumas personalizações. Aqui ocorre a construção do conteúdo do email, além das configurações do servidor smtp.

/////////////////////////////////////////
/**
* Voce deve alterar todos os dados abaixo
*/
$servidor = “00.000.000.000″;
//Atencao para o servidor SMTP. Recomendamos que voce coloque o IP
$email_destino = “seu@email.com”;
$email_smtp = “formulario@email.com”;
$senha = “suasenha”;

$porta = 25;
/////////////////////////////////////////
/////////////////////////////////////////

require(”mail.php”);

/////////////////////////////////////////
/**
* Aqui sao recebidos os dados do formulario e
* construindos o conteudo do email
*/

$assunto = $_POST[’assunto’];
$mensagem = $_POST[’mensagem’];
$remetente = $_POST[’mail’];
$nome = $_POST[’nome’];

$conteudo = ”
<strong>Nome</strong>: $nome <br>
<strong>Email</strong>: $remetente <br>
<strong>Assunto</strong>: $assunto <br>
<strong>Mensagem</strong>: $mensagem <br>
“;

$assunto = “Contato: $assunto”;
/////////////////////////////////////////
/////////////////////////////////////////

/////////////////////////////////////////
$envio = enviamail($servidor,$porta,$email_destino,$email_smtp,$senha,$assunto,$conteudo,$nome,$remetente);

if($envio){
header(”Location: sucesso.html”);
}
/////////////////////////////////////////
/////////////////////////////////////////

Algumas coisas a serem observadas. Primeiro é em relação ao servidor. O correto seria colocar mail.seudominio.com.br ou smtp.seudominio.com.br de acordo com as intruções do seu provedor de email. Porém, quando o provedor de email é o mesmo da hospedagem isso pode causar algum erro (dependendo de como ele esteja configurado). Nesse caso, use diretamente o IP.

A variável $email_destino deverá conter o endereço da conta que receberá os contatos enviados por email. Seu endereço real, particular. A variável email smtp deverá conter o endereço de email da conta que irá se autenticar no smtp para enviar a mensagem. Pode ser sua conta pessoal, mas não recomendo pois sua senha ficará exposta. Recomendo que crie uma conta exclusivamente para isso. A variável $senha, obviamente, é a senha do email que será autenticado no smtp.

Agora falta apenas a pagina de sucesso.html. A minha eu fiz assim, mas fique à vontade para respeitar o layout de seu site

<head>

<style type=”text/css”>
<!–

body {
background-color: #EEE9E9;
color:#2F4F4F;
font: 32px verdana, arial, helvetica, sans-serif;
margin:0;
padding:0;
text-align:center;
}

#caixa{
background-color: #F8F8FF;
border-color: #E6E8FA;
border: 1px dashed;
height: 230px;
top: 50%;
left: 50%;
margin-top: -200px;
margin-left: -250px;
padding-top: 170px;
position: absolute;
width: 500px;
}

–>
</style>

<meta http-equiv=”Content-Type” content=”text/html; charset=iso-8859-1″ />
<title>Envio bem sucedido!</title>
</head>

<body>

<div id=”caixa” align=”center”> Contato enviado com sucesso </div>

</body>
</html>

Para não perder tempo no ctrl+c , ctrl+v, compactei todos os arquivos e disponibilizei para download. Agora é só baixar, personalizar e usar.

2 / Fevereiro / 2008  Dicas e Tutoriais 
  • 1. claudio  |  Fevereiro 4th, 2008 às 3:51 am

    Olha só, comigo esse negócio não funcionou.
    tem mais alguma coisa que precisa mudar?

  • 2. Caramujo  |  Fevereiro 9th, 2008 às 11:40 am

    Não há mais nada a ser mudado, Claudio. Apenas essas linhas devem ser suficientes:
    $servidor = “00.000.000.000″;
    $email_destino = “seu@email.com”;
    $email_smtp = “formulario@email.com”;
    $senha = “suasenha”;

    Alguma mensagem de erro é exibida? Geralmente o problema está no servidor smtp informado. Tente colocar mail.seudominio.com.br (ou smtp.seudominio.com.br, de acordo com as informações do seu provedor de email), se não funcionar, coloque direto o ip do seu servidor de email.

  • 3. Paulo Henrique  |  Fevereiro 14th, 2008 às 8:43 am

    Bom dia…mto bom seu blog.
    mais não sei uma coisa, se possívewl me ajude.
    Como faço para passar esses arquivos que baixei para meu blog?
    Muito Obrigado.
    Abraços

  • 4. Danilo  |  Fevereiro 21st, 2008 às 3:27 pm

    então cara, to tentando fazer para enviar para meu e-mail da uol soh q não consigo =/ aparece msg enviada soh q n chega no e-mail =/
    porq será?

  • 5. Caramujo  |  Fevereiro 21st, 2008 às 6:01 pm

    Opa Danilo,
    O script funciona que é uma beleza. Se a mensagem não está chegando a hipótese mais provável é que seu serviço de e-mail esteja considerando ela como SPAM.
    Sugiro que tente mudar o remetente da mensagem para o endereço que a enviou por smtp. No arquivo mail.php procure por:

    //$de = $login_smtp;
    $de = $email_remetente;

    …e substitua por:

    $de = $login_smtp;
    //$de = $email_remetente;

    E ae, ajudou?

  • 6. Pedro  |  Março 20th, 2008 às 8:15 pm

    Boas,
    O script n funciona. Já alterei o ficheiro mail.php. Faz a redirecção para a página de confirmação de email enviado mas n chega nenhum email. O que posso fazer??

  • 7. Pedro  |  Março 20th, 2008 às 9:33 pm

    Este script é simples e faz o trabalho direitinho:

    //Pedro Vasconcelos
    //2008
    // Coloque a mensagem que irá ser enviada para seu e-mail abaixo:
    $assunto = $_POST[’assunto’];
    $remetente = $_POST[’mail’];
    $msg = “Mensagem enviada em “.date(”d/m/Y”).”, os dados seguem abaixo:\n”;
    while(list($campo, $valor) = each($HTTP_POST_VARS)) {
    $msg .= ucwords($campo).”: “.$valor.”\n”;
    }

    // Agora iremos fazer com que o PHP envie os dados do Formulário para seu e-mail:
    mail(”seuemail@oseudominio.com”, $assunto ,$msg,”From:” . $remetente );
    header(”Location: thankyou.html”);
    ?>

    Cumprimentos

    Pedro Vasconcelos
    Designer CG
    Portugal

  • 8. Caramujo  |  Março 21st, 2008 às 12:05 pm

    Opa Pedro, realmente esse código é bem mais simples. Mas o formulário sugerido no seu comentário envia o email sem autenticar no stmp. Alguns provedores estão bloqueando esse tipo de envio. O formmail sugerido no post é para envios autenticados.

  • 9. mauricio nunes  |  Março 30th, 2008 às 7:56 am

    Parabéns, ate agora depois de 6 horas pesquisando o seu foi oi unico que funcionou vou toma-lo como base para um teste
    Novamente
    Meus parabéns

  • 10. jkk  |  Abril 15th, 2008 às 10:50 am

    jkjk

  • 11. Gekssavafex  |  Maio 31st, 2008 às 1:53 pm

    Hello, my friend!
    Please, don’t hate me, I just want to earn some money :)
    See you!
    Buy phentermine here!

  • 12. bill  |  Julho 22nd, 2008 às 2:04 pm

    JvIej3 qv8032ry07vdd91vdsv0ylv7y4

  • 13. Anônimo  |  Agosto 1st, 2008 às 1:51 am

    xxxxxxxxxxxxxxxxxxxxxxxxxxxx

  • 14. tramadol&hellip  |  Agosto 5th, 2008 às 10:55 am

    buy cod tramadol…

    tramadol without a prescription…

Comentar

hidden

Trackback  |  Receber comentários por Feed RSS