iMasters Fóruns: Formulário de Contato com múltiplos destinatários - iMasters Fóruns

Ir para

Bom uso da área



Atenção:
Este subfórum é destinado apenas para postagem de scripts prontos e testados para auxiliar os demais membros.
Não é permitido a abertura de tópicos com dúvidas. Para isso, use o Fórum de PHP.
Página 1 de 1
  • Novo tópico
  • Responder

Formulário de Contato com múltiplos destinatários PHPMailer + Gmail

#1 Membro offline   Matias Rezende Ícone

  • Moderador PHP
  • Ícone
  • Grupo: Moderadores
  • Posts: 3285
  • Cadastrado: 02-março 09
  • Sexo:Masculino
  • Localização:São José - SC

Postou 19 setembro 2009 - 17:28

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
- Nome *
- E-mail *
- Telefone
- Destinatários (aqui temos um grupo de checkbox, para que o usuário possa selecionar mais de um) *
- Assunto *
- Mensagem *

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']); 
	}
	else 
	{
		$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/>';
		}
	}
	else 
	{
		$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);
		} 
	}
	else 
	{
		$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']); 
	}
	else 
	{
		$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'])); 
	}
	else 
	{
		$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);	
	}
	// Aqui enviamos o e-mail. Caso apresente algum erro, vai exibi-lo.
	if(!$mail->Send()) 
	{
	  echo 'Erro ao enviar e-mail: ' . $mail->ErrorInfo;
	} 
	else 
	{
	  echo 'Sua mensagem foi enviada com sucesso.';
	  unset($_POST);
	}
}
?>
<!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>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.
PHPMailer

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.imaster...ost__p__1421431

Este post foi editado por Matias Rezende: 06 novembro 2009 - 20:12
Razão por editar:: Algumas correções no código | Adição de descrição no início do POST | Adição de link para nova versão


#2 Membro offline   iFull Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 101
  • Cadastrado: 01-fevereiro 09
  • Sexo:Masculino

Postou 21 setembro 2009 - 08:40

fala matias td bem?
olha o que deu !!! ;)

Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /home/clinicac/public_html/class.smtp.php on line 41


Obs: usei os arquivos para versão de php 4.3.7 sera esse o problema? se eu trocar por esta que você está disponibiizando ai será que vai ter alguma diferença?

#3 Membro offline   Matias Rezende Ícone

  • Moderador PHP
  • Ícone
  • Grupo: Moderadores
  • Posts: 3285
  • Cadastrado: 02-março 09
  • Sexo:Masculino
  • Localização:São José - SC

Postou 21 setembro 2009 - 08:43

Olha, é possível que o problema seja este, tanto que o erro é no arquivo

Quote

/home/clinicac/public_html/class.smtp.php


Isto acontece por causa dos parâmetros de visibilidade (public, private, protected) que não existiam no PHP 4.

Tenta atualizar o teu PHP para 5 > e usar a última versão do PHPMailer. E o pior é que eu não tenho nem como te ajudar no PHP 4, porque não tenho esta versão aqui para testar.

Carlos Eduardo

#4 Membro offline   dreadigor Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 4
  • Cadastrado: 28-setembro 09

Postou 28 setembro 2009 - 12:44

desculpe a minha ignorancia mas esse codigo todo eu uso em qual arquivo?
exemplo qual o codigo do contato php, e o do enviar php. E o meu html como fica?

#5 Membro offline   Matias Rezende Ícone

  • Moderador PHP
  • Ícone
  • Grupo: Moderadores
  • Posts: 3285
  • Cadastrado: 02-março 09
  • Sexo:Masculino
  • Localização:São José - SC

Postou 28 setembro 2009 - 14:16

Neste caso, está tudo em um arquivo só, para que, no momento da validação não precise enviar os dados por $_SESSION. É só para facilitar o entendimento mesmo.

Carlos Eduardo

#6 Membro offline   dreadigor Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 4
  • Cadastrado: 28-setembro 09

Postou 28 setembro 2009 - 17:54

Postou Hoje, 14:16
Neste caso, está tudo em um arquivo só, para que, no momento da validação não precise enviar os dados por $_SESSION. É só para facilitar o entendimento mesmo.

Carlos Eduardo

Obrigado pela resposta. Este arquivo pode ter qualquer nome?

#7 Membro offline   dreadigor Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 4
  • Cadastrado: 28-setembro 09

Postou 28 setembro 2009 - 18:04

Tem como ser mais explicativo. Quanto ao uso dos arquivos como serão e quantos serão, como que eu farei para que funcione. Não entendi como ele pode ser um arquivo só. Por favor ajude-me
Preciso de um formulario em que eu possa ao preencher selecionar em um dropdown em qual setor (email) o formulario será entregue. Acho q é esse só não sei como usa-lo.
Obrigado aguardo resposta.
Desculpe a minha ignorancia, mas essa coisa de ter que selecionar o setor me quebrou se fosse um form normal tava tranquilo.

#8 Membro offline   Matias Rezende Ícone

  • Moderador PHP
  • Ícone
  • Grupo: Moderadores
  • Posts: 3285
  • Cadastrado: 02-março 09
  • Sexo:Masculino
  • Localização:São José - SC

Postou 28 setembro 2009 - 21:27

Como você vai fazer.
Copia este código que está ali em cima e cola em um arquivo. Pode salvar com qualquer nome.
Além disto, baixa o arquivo ZIP deste link. http://sourceforge.n....2.zip/download.
Extraia o conteúdo dele em uma pasta chamada PHPMailer (exatamente como está aqui).

Execute. Na primeira execução, ou seja, antes de enviar os dados, vai exibir o formulário. Se todos os campos forem preenchidos corretamente, vai enviar o e-mail para o(s) destinatário(s) selecionado(s). Caso não preencha todos os campos obrigatórios, ou caso o e-mail não seja válido, não vai enviar o e-mail e vai exibir as mensagem de erro abaixo, além de manter os dados preenchidos no formulário.

// 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',
        );



Nesta parte do código, você vai colocar os dados dos e-mails que poderão ser escolhidos. Na primeira parte (aonde está Recursos Humanos) vai o título, e na segunda parte vai o e-mail relativo àquele título.

De resto, leia os comentários dentro do código. Está bem explicado.

Caso tente e não consiga, poste a sua dúvida no fórum principal que poderemos te ajudar.

Carlos Eduardo

#9 Membro offline   dreadigor Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 4
  • Cadastrado: 28-setembro 09

Postou 05 outubro 2009 - 18:53

Muito obrigado Matias, vou tentar e coloco aqui depois o resultado.
Valeu

#10 Membro offline   jrnin Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 19
  • Cadastrado: 04-maio 05

Postou 27 outubro 2009 - 14:56

Ver postdreadigor, em 05 outubro 2009 - 18:53 , disse:

Muito obrigado Matias, vou tentar e coloco aqui depois o resultado.
Valeu

Olá, pessoal seguinte usei esse script em um site e funfou perfeitamente...mas depois de algums dias a pagina está infectada e parece-me que o arquivo PHPMailer/examples/index.html tem algum script malicioso...mas como sou leigo nao sei que linha posso deletar.

gostaria de saber se esse script é confiavel? e como posso identificar qual a linha maliciosa?

#11 Membro offline   Matias Rezende Ícone

  • Moderador PHP
  • Ícone
  • Grupo: Moderadores
  • Posts: 3285
  • Cadastrado: 02-março 09
  • Sexo:Masculino
  • Localização:São José - SC

Postou 27 outubro 2009 - 15:00

Olha, como está na pasta examples, pode excluir a pasta inteira, porque nela só tem exemplos de utilização do PHPMailer.

Carlos Eduardo

#12 Membro offline   Kako F Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 6
  • Cadastrado: 13-março 08
  • Localização:RS, Brasil

Postou 31 outubro 2009 - 19:50

Matias, primeiramente parabéns pelo tutorial, foi de grande utilidade.
Tenho uma dúvida.

As mensagens que eu recebo estão vindo com o e-mail do gmail.
Outra dúvida seria, como eu posso adicionar dois emails em um mesmo departamento.

#13 Membro offline   Matias Rezende Ícone

  • Moderador PHP
  • Ícone
  • Grupo: Moderadores
  • Posts: 3285
  • Cadastrado: 02-março 09
  • Sexo:Masculino
  • Localização:São José - SC

Postou 31 outubro 2009 - 20:12

Quote

As mensagens que eu recebo estão vindo com o e-mail do gmail.


Isto acontece porque você está enviando com a autenticação do gmail. Você pode fazer a autenticação pelo seu provedor ou enviar sem autenticação.

Quote

Outra dúvida seria, como eu posso adicionar dois emails em um mesmo departamento.

Como assim? Seria algo como, ao selecionar um checkbox ele enviar para 2 ou mais e-mail?

Carlos Eduardo

#14 Membro offline   Kako F Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 6
  • Cadastrado: 13-março 08
  • Localização:RS, Brasil

Postou 06 novembro 2009 - 19:51

Ver postMatias Rezende, em 31 outubro 2009 - 21:12 , disse:

Quote

As mensagens que eu recebo estão vindo com o e-mail do gmail.


Isto acontece porque você está enviando com a autenticação do gmail. Você pode fazer a autenticação pelo seu provedor ou enviar sem autenticação.

Quote

Outra dúvida seria, como eu posso adicionar dois emails em um mesmo departamento.

Como assim? Seria algo como, ao selecionar um checkbox ele enviar para 2 ou mais e-mail?

Carlos Eduardo


Isso, exatamente selecionar um checkbox e enviar para 2 e-mails diferentes.

#15 Membro offline   Matias Rezende Ícone

  • Moderador PHP
  • Ícone
  • Grupo: Moderadores
  • Posts: 3285
  • Cadastrado: 02-março 09
  • Sexo:Masculino
  • Localização:São José - SC

Postou 06 novembro 2009 - 20:05

Então... achei interessante a idéia. Fiz a modificação no código.
<?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.1
 * @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' => array(
					'email1@email.com.br',
					'email2@email.com.br',
					'email3@email.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']); 
        }
        else 
        {
                $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/>';
                }
        }
        else 
        {
                $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);
                } 
        }
        else 
        {
                $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']); 
        }
        else 
        {
                $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'])); 
        }
        else 
        {
                $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)
        {
        	if(is_array($destino))
        	{
        		foreach ($destino as $destinoArray)
        		{
        			$mail->AddAddress($destinoArray);
        		}
        	}
        	else
        	{
				$mail->AddAddress($destino);
        	}    
        }
        // Aqui enviamos o e-mail. Caso apresente algum erro, vai exibi-lo.
        if(!$mail->Send()) 
        {
          echo 'Erro ao enviar e-mail: ' . $mail->ErrorInfo;
        } 
        else 
        {
          echo 'Sua mensagem foi enviada com sucesso.';
          unset($_POST);
        }
}
?>
<!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>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>


O que foi modificado.

// adicione os emails a serem utilizados 
$destinos = array(
                'Recursos Humanos' => array(
					'email1@email.com.br',
					'email2@email.com.br',
					'email3@email.com.br'),
                'Financeiro'       => 'financeiro@site.com.br',
                'Administração'    => 'adm@site.com.br',
        );

Quando for marcado Recursos Humanos, vai enviar para os emails que estão dentro do array que está ali.

A outra parte que foi mudado é aqui.
        // Aqui varremos o array $destinatario para adicionar os e-mail selecionados
        foreach($destinatario as $destino)
        {
                // testa se é um array. Se for, joga dentro de um foreach. Se não for, apenas adiciona o endereço.
        	if(is_array($destino))
        	{
        		foreach ($destino as $destinoArray)
        		{
        			$mail->AddAddress($destinoArray);
        		}
        	}
        	else
        	{
				$mail->AddAddress($destino);
        	}    
        }


Acho que agora vai.

Carlos Eduardo

#16 Membro offline   PhEu.BR Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 7
  • Cadastrado: 08-novembro 09

Postou 12 novembro 2009 - 20:44

Amigo, o script ta com algum bug, qdo eu recebo o formulario por email, na parte q deveria vir a mensagem, ta vindo "nome"

#17 Membro offline   Matias Rezende Ícone

  • Moderador PHP
  • Ícone
  • Grupo: Moderadores
  • Posts: 3285
  • Cadastrado: 02-março 09
  • Sexo:Masculino
  • Localização:São José - SC

Postou 13 novembro 2009 - 06:58

Neste ponto é onde vai o conteúdo do e-mail.
        /**
         * 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/>';


Veja se está correto.

Carlos Eduardo

#18 Membro offline   PhEu.BR Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 7
  • Cadastrado: 08-novembro 09

Postou 13 novembro 2009 - 12:20

continuo recebendo o nome em mensagem.
Imagem

#19 Membro offline   Matias Rezende Ícone

  • Moderador PHP
  • Ícone
  • Grupo: Moderadores
  • Posts: 3285
  • Cadastrado: 02-março 09
  • Sexo:Masculino
  • Localização:São José - SC

Postou 13 novembro 2009 - 12:53

Como está esta parte do seu código?

        /**
         * 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/>';


E esta
        // 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'])); 
        }
        else 
        {
                $erro .= '- Preencha o Mensagem<br/>';   
        }


Carlos Eduardo

#20 Membro offline   Kako F Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 6
  • Cadastrado: 13-março 08
  • Localização:RS, Brasil

Postou 16 novembro 2009 - 16:08

Valeu mesmo, tudo ok!
Abraços

Página 1 de 1
  • Novo tópico
  • Responder

2 usuário(s) está(ão) lendo este tópico
0 membro(s), 2 visitante(s) e 0 membros anônimo(s)