fbpx

Como fazer formulários PHP enviando e-mail com o PHPMailer

Como fazer formulários PHP enviando e-mail com o PHPMailer

No artigo de hoje mostraremos como é fácil fazer (ou utilizar) um script PHP para o envio seguro de dados dos seus formulários, além de permitir autenticação ao servidor SMTP e ter uma maior chance das mensagens chegarem aos seus destinatários diretamente na caixa de entrada.

É comum observarmos casos de “invasões” a formulários comuns que utilizam a função mail() sem autenticação, o que acabam comprometendo não apenas o servidor, como também culminam no bloqueio/suspensão da conta de hospedagem.

O que é o PHPMailer?

Basicamente é uma classe do PHP que possui funções mais avançadas que a classe mail() padrão. Um dos seus diferenciais é permitir o envio seguro, principalmente a servidores que tenham requerimento por autenticação. A classe faz a autenticação do usuário/senha do SMTP no servidor e garante que aquele e-mail está sendo enviado realmente pela conta autenticada. No uso da função mail() padrão, não há autenticação, por isso os servidores podem rejeitar o recebimento destas mensagens – e é o que acontece em grandes provedores.

Como usá-lo?

Criei um script funcional para você, com um formulário em HTML que faz o envio das diretivas para o arquivo “enviar.php”, que inclui as funções contidas em “phpmailer.php”. Então, é uma estrutura com três arquivos, sendo eles:

formulario.html: É ele o responsável pelos campos do formulário e faz o envio das variáveis para o arquivo envia.php

envia.php: Processa as variáveis transportadas via POST do formulário e ativa as diretivas do phpmailer.php

phpmailer.php: Contém as orientações do PHP para, além de autenticar o disparo, incluir todas as linhas requeridas do header para um e-mail seguro.

Eis então os códigos:

Eu deixei todos os arquivos comentados para ficar ainda mais fácil de se editar. Basicamente, o único arquio que requer alterações (além do formulario.html que você pode personalizar com CSS do jeito que preferir) é o envia.php, onde você colocará o seu usuário de acesso para autenticação do SMTP, sua senha e o endereço de destino, para onde as mensagens do formulário serão enviadas. Além disto, edite também o caminho onde o formulário é acessado e, por fim, o endereço da sua página.

formulario.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=utf-8" />
<title>Formulário de Contato</title>
<style type="text/css">
#contato {
	font-family: Arial, Helvetica, sans-serif;
}

#contato input, #contato textarea {
	font-family: Arial, Helvetica, sans-serif;
	padding: 5px;
	width: 250px;
}
</style>
</head>

<body>
<form action="envia.php" method="post" id="contato">
<fieldset>
<legend>Formulário de Contato</legend>

    <label>Seu nome:</label><br />
    <input name="nome" type="text" /><br /><br />

    <label>Seu email:</label><br />
    <input name="email" type="text" /><br /><br />

    <label>Assunto:</label><br />
    <input name="assunto" type="text" /><br /><br />

    <label>Mensagem:</label><br />
    <textarea name="mensagem" rows="10"></textarea><br /><br />

    <input name="submit" type="submit" value="Enviar" style="width: auto;" />
</fieldset>
</form>
</body>
</html>

envia.php

<?php

include_once('phpmailer.php'); //Chama o arquivo phpmailer.php com as funções para realizar o envio.

//#########################################
// Recebe as informações do formulário
//#########################################

$nome = $_POST['nome'];
$email = $_POST['email'];
$assunto = $_POST['assunto'];
$mensagem = $_POST['mensagem'];

//#########################################
// Dados da conta de e-mail que fará o envio
//#########################################

$smtp = new Smtp("localhost"); //Endereço do SMTP, geralmente localhost.
$smtp->user = "seuemail@provedor.com.br";  //Conta de email
$smtp->pass = "suasenha"; //Senha da Conta de e-mail.
$smtp->debug = false; //Somente para usuários avançados que desejam o log do envio para testes.

//#########################################
// Envio do formulário
//#########################################

$to = "email@destino.com.br"; //Informe aqui o e-mail que deve receber a mensagem do formulário.
$from = $email;
$subject = "Contato - " . $assunto;
$msg = $mensagem;

	if (isset($_POST['submit'])) {
		if($nome && $email && $assunto && $mensagem) {
				if($smtp->Send($to, $from, $subject, $msg)){
					echo "<script>alert('Contato enviado!');</script>";
					echo "<script>window.location = 'index.php';</script>"; //Altere aqui para o endereço de sua página.
					exit;
				}
	   }

	   else {
		  	echo "<script>alert('Preencha todos os campos!');</script>";
			echo "<script>window.location = 'formulario.html';</script>"; //Altere aqui para o endereço de seu formulário
			exit;
	   }

	}

?>

phpmailer.php

<?php

class Smtp{

var $conn;
var $user;
var $pass;
var $debug = false;

function Smtp($host){
  $this->conn = fsockopen($host, 25, $errno, $errstr, 30);
  $this->Put("EHLO $host");
}
function Auth(){
  $this->Put("AUTH LOGIN");
  $this->Put(base64_encode($this->user));
  $this->Put(base64_encode($this->pass));
}
function Send($to, $from, $subject, $msg){

    $this->Auth();
  $this->Put("MAIL FROM: " . $from);
  $this->Put("RCPT TO: " . $to);
  $this->Put("DATA");
  $this->Put($this->toHeader($to, $from, $subject));
  $this->Put("\r\n");
  $this->Put($msg);
  $this->Put(".");
    $this->Close();
  if(isset($this->conn)){
  return true;
  }else{
  return false;
  }
}
function Put($value){
  return fputs($this->conn, $value . "\r\n");
}
function toHeader($to, $from, $subject){
  $header  = "Message-Id: <". date('YmdHis').".". md5(microtime()).".". strtoupper($from) ."> \r\n";
  $header .= "From: <" . $from . "> \r\n";
  $header .= "To: <".$to."> \r\n";
  $header .= "Subject: ".$subject." \r\n";
  $header .= "Date: ". date('D, d M Y H:i:s O') ." \r\n";
  $header .= "X-MSMail-Priority: High \r\n";
  return $header;
}
function Close(){
  $this->Put("QUIT");
  if($this->debug == true){
  while (!feof ($this->conn)) {
    echo fgets($this->conn) . "<br>\n";
  }
  }
  return fclose($this->conn);
}
}

?>

Deixe um comentário

avatar

This site uses Akismet to reduce spam. Learn how your comment data is processed.

  Subscribe  
Notify of