Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal, vejo muita gente procurando formulário de contato com os destinatários podendo ser escolhido pelo usuário. Resolvi então criar um formulário, com múltiplos destinatários, utilizando a classe PHPMailer.
O código é grande, mas é porque tem bastante comentário, para explicar passo a passo o que está sendo feito.
O que temos aqui.
Um formulário de contato, contendo os campos
O formulário conta com validação de e-mail através de Expressão Regular e validação de campos obrigatórios.
Se a validação falhar, os valores preenchidos continuam nos campos.
Também existe a proteção contra Injection.
O envio é autenticado utilizando a classe PHPMailer e os servidores do Gmail.
<?php
/**
* Exemplo de envio autenticado com PhpMailer, utilizando o Gmail, para múltiplos destinatários
*
* Coloque no value de cada checkbox o e-mail a ser enviado.
*
* Neste exemplo, usamos os seguintes e-mails
* - rh@site.com.br
* - adm@site.com.br
* - financeiro@site.com.br
*
* Para que seja possível enviar, tenha certeza que a extensão php_openssl.dll esteja descomentada
* no seu PHP.INI
*
* @author MatiasRezende
* @version 1.0
* @since 2009-09-17
*/
/**
* Aqui testamos se a extensão openssl foi carregada, pois ela é necessária para o envio.
* Caso ela não tenha sido carregada, ou seja, não esteja habilitada, vai encerrar o processamento.
*/
if(!extension_loaded('openssl'))
{
die('A extensão OpenSSL não está habilitada no seu PHP.INI. Habilite-a e tente novamente.');
}
// adicione os emails a serem utilizados
$destinos = array(
'Recursos Humanos' => 'rh@site.com.br',
'Financeiro' => 'financeiro@site.com.br',
'Administração' => 'adm@site.com.br',
);
// Usuário do gmail
$username = 'seuemail@gmail.com';
// Senha do usuário do Gmail
$password = 'suasenha';
// E-mail que vai aparecer como remetente
$from = 'SeuEmail@site.com.br';
// Nome que vai aparecer como remetente
$fromName = 'Seu Nome';
/**
* Início da validação. Estamos validando somente se está setado e escapando aspas.
* Faremos a mesma coisa para todos os campos.
*
*/
$erro = '';
// Testamos se o formulário foi enviado. Necessário para que não exiba mensagem de erro no primeiro
// acesso
if(isset($_POST['enviar']))
{
// Setamos $gpc como get_magic_quotes_gpc. Se existir, terá valor true. Caso contrário, será false
$gpc = get_magic_quotes_gpc();
// Validação campo Nome
if(isset($_POST['Nome']) && !empty($_POST['Nome']))
{
// Aqui estamos verificando se não está habilitado magic_quotes_gpc, escapa as aspas simples com addslashes.
$nome = ($gpc) ? $_POST['Nome'] : addslashes($_POST['Nome']);
} $erro .= '- Preencha o Nome.<br/>';
}
// Validação campo E-mail. Validamos também o formato, usando expressão regular
if(isset($_POST['E-mail']) && !empty($_POST['E-mail']))
{
// Aqui estamos verificando se não está habilitado magic_quotes_gpc, escapa as aspas simples com addslashes.
$email = ($gpc) ? $_POST['E-mail'] : addslashes($_POST['E-mail']);
// Aqui validamos se o e-mail é válido, utilizando expressão regular.
if (!preg_match ('/^[A-Za-z0-9]+([_.-][A-Za-z0-9]+)*@[A-Za-z0-9]+([_.-][A-Za-z0-9]+)*\\.[A-Za-z0-9]{2,4}$/', $email))
{
$erro .= '- E-mail Inválido.<br/>';
}
} $erro .= '- Preencha o E-mail<br/>';
}
// Validação campo Telefone. Como ele não é obrigatório, tiramos o else, que exibe mensagem de erro caso não esteja preenchido
if(isset($_POST['Telefone']) && !empty($_POST['Telefone']))
{
// Aqui estamos verificando se não está habilitado magic_quotes_gpc, escapa as aspas simples com addslashes.
$telefone = ($gpc) ? $_POST['Telefone'] : addslashes($_POST['Telefone']);
}
// Validação campo Destinatário
if(isset($_POST['Destinatario']) && !empty($_POST['Destinatario']))
{
// Aqui estamos verificando se não está habilitado magic_quotes_gpc, escapa as aspas simples com addslashes.
foreach ($_POST['Destinatario'] as $valor)
{
// Aqui adicionamos o radical do e-mail.
$destinatario[] = ($gpc) ? $valor : addslashes($valor);
}
} $erro .= '- Selecione pelo menos 1 Destinatario<br/>';
}
// Validação campo Assunto
if(isset($_POST['Assunto']) && !empty($_POST['Assunto']))
{
// Aqui estamos verificando se não está habilitado magic_quotes_gpc, escapa as aspas simples com addslashes.
$assunto = ($gpc) ? $_POST['Assunto'] : addslashes($_POST['Assunto']);
} $erro .= '- Preencha o Assunto.<br/>';
}
// Validação campo Mensagem
if(isset($_POST['Mensagem']) && !empty($_POST['Mensagem']))
{
// Aqui estamos verificando se não está habilitado magic_quotes_gpc, escapa as aspas simples com addslashes.
// Adicionamos também a função que troca nova linha por <br/>
$mensagem = ($gpc) ? nl2br($_POST['Mensagem']) : addslashes(nl2br($_POST['Nome']));
} $erro .= '- Preencha o Mensagem<br/>';
}
}
/**
* Aqui testamos se o formulário foi enviado e se não existe erro nele.
* Caso seja válido, entramos na rotina de enviar o e-mail
*/
if(isset($_POST['enviar']) && empty($erro))
{
// aqui incluímos a pasta onde está a classe PhpMailer no include_path
set_include_path('PHPMailer'. PATH_SEPARATOR .get_include_path());
// incluímos a classe phpmailer. Não utilizamos a pasta onde ela está porque já incluímos anteriormente
include 'class.phpmailer.php';
/**
* Aqui definimos o corpo do e-mail.
*/
$conteudo = '
<html>
<body>
<h1>Contato enviado pelo site</h1>
<b>Nome</b> - '.$nome.'<br/>
<b>E-mail</b> - '.$email.'<br/>';
if(isset($telefone)) $conteudo .= '<b>Telefone</b> - '.$telefone.'<br/>';
$conteudo .= '<b>Destinatários</b> - '.implode(' , ',$destinatario).'<br/>
<b>Assunto</b>'.$assunto.'<br/>
<b>Mensagem</b>'.$mensagem.'<br/>';
// Instanciamos a classe PHPMailer
$mail = new PHPMailer();
// Aqui definimos o charset do e-mail a ser enviado.
$mail->CharSet = 'UTF-8';
//Definimos que é SMTP
$mail->IsSMTP();
//Definimos que utilizaremos HTML
$mail->IsHTML(true);
// habilitamos autenticação SMTP
$mail->SMTPAuth = true;
// seta o prefixo ssl
$mail->SMTPSecure = 'ssl';
// seta o Gmail como servidor SMTP
$mail->Host = 'smtp.gmail.com';
// seta a porta SMTP
$mail->Port = 465;
// Nome de usuário do Gmail
$mail->Username = $username;
// Senha do usuário do Gmail
$mail->Password = $password;
// Aqui você coloca o e-mail que vai aparecer como remetente
$mail->From = $from;
// Aqui você coloca o nome que vai aparecer como remetente
$mail->FromName = $fromName;
// Aqui vai a variável que tem o assunto, que vem do formulário
$mail->Subject = $assunto;
// Seta o WordWrap
$mail->WordWrap = 50;
// Aqui vai o conteúdo da mensagem a ser enviada
$mail->MsgHTML($conteudo);
// Aqui vai o e-mail da pessoa que enviou o contato, para resposta
$mail->AddReplyTo($email,$nome);
// Aqui varremos o array $destinatario para adicionar os e-mail selecionados
foreach($destinatario as $destino)
{
$mail->AddAddress($destino);
} echo 'Erro ao enviar e-mail: ' . $mail->ErrorInfo;
} echo 'Sua mensagem foi enviada com sucesso.';
unset($_POST);
}
}
?><html xmlns="http-~~-//www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Exemplo de Formulário de Contato</title>
</head>
<body>
<h1>Formulário de Contato</h1>
<form id="contato" name="contato" method="post" action="<?php echo $_SERVER['PHP_SELF']?>">
<label><strong>Nome*</strong><br />
<input type="text" name="Nome" id="Nome" value="<?php echo (isset($_POST['Nome'])) ? $_POST['Nome']: '' ; ?>" /></label><br />
<label><strong>E-mail*</strong><br />
<input type="text" name="E-mail" id="E-mail" value="<?php echo (isset($_POST['E-mail'])) ? $_POST['E-mail']: '' ; ?>" /></label><br />
<label><strong>Telefone</strong><br />
<input type="text" name="Telefone" id="Telefone" value="<?php echo (isset($_POST['Telefone'])) ? $_POST['Telefone']: '' ; ?>" /></label><br />
<strong>Destinatário*</strong><br />
<?php
// aqui fazemos o preenchimento dos e-mail.
foreach ($destinos as $chave => $valor)
{
echo '<label><input type="checkbox" name="Destinatario[]" value="'.$valor.'" id="destinatario_0"';
echo (isset($_POST['Destinatario']) && in_array($valor,$_POST['Destinatario'])) ? 'checked="checked" ' : '' ;
echo '/>'.$chave.'</label><br />';
}
?>
<br />
<label><strong>Assunto*</strong><br />
<input type="text" name="Assunto" id="Assunto" value="<?php echo (isset($_POST['Assunto'])) ? $_POST['Assunto']: '' ; ?>" /></label><br />
<label><strong>Mensagem*</strong><br />
<textarea name="Mensagem" id="Mensagem" cols="45" rows="5"><?php echo (isset($_POST['Mensagem'])) ? $_POST['Mensagem']: '' ; ?></textarea></label><br />
<label><input type="submit" name="enviar" id="enviar" value="Enviar Contato" /></label>
<div id="erro">
<?php
/**
* Aqui testamos. Se a $erro não estiver vazia, significa que temos erro no preenchimento do formulário,
* então exibimos os erros no preenchimento.
* Para formatar a mensagem, formate o #erro no seu CSS.
*/
echo (!empty($erro)) ? 'Foram encontrados erros no preenchimento do formulário<br/>'.$erro : '' ;
?>
</div>
</form>
</body>
</html>
Utilizando a classe PHPMailer, para PHP 5_6. Foi testada com a versão 5.0.2.
Extraia os arquivos para uma pasta chamada PHPMailer.
Espero que gostem. O código está todo comentado.
Comentários, críticas e sugestões são bem vindas.
Carlos Eduardo
EDIT - Seguindo a sugestão do João Batista Neto, fiz algumas alterações no código.
EDIT2 - 06/11/2009 - Fiz uma nova versão do script, que agora, ao selecionar um checkbox, pode enviar para mais de um e-mail.
Link para a nova versão (que está abaixo neste mesmo tópico) - http://forum.imasters.com.br/index.php?/topic/363321-formulario-de-contato-com-multiplos-destinatarios/page__view__findpost__p__1421431
Carregando comentários...