Jump to content
Fórum Script Brasil
  • 0

PHPMailer e Locaweb


PiXwell
 Share

Question

Bom dia,
Tenho um site hospedado na Locaweb (Hospedagem Linux), e estou enviando um formulário de e-Mail via Ajax ... o envio está ocorrendo corretamente, o problema está na quantidade de mensagens. Ao invés de enviar apenas uma mensagem, está disparando 5 mensagens iguais, vejam a imagem "caixa de entrada" anexada à esse tópico. 

Script PHP:

<?php
require 'mailer/PHPMailerAutoload.php';
$mail_restaurante = new PHPMailer;
$mail_cliente = new PHPMailer;

// Campos do formulario
$nome = filter_input(INPUT_POST, 'nome', FILTER_SANITIZE_SPECIAL_CHARS);
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_SPECIAL_CHARS);
$dataReserva = filter_input(INPUT_POST, 'data-reserva', FILTER_SANITIZE_SPECIAL_CHARS);
$horaReserva = filter_input(INPUT_POST, 'hora-reserva', FILTER_SANITIZE_SPECIAL_CHARS);
$qtdPessoas = filter_input(INPUT_POST, 'qtd-pessoas', FILTER_SANITIZE_SPECIAL_CHARS);

//====================================================
//Informacoes dos e-Mails **************************//
//====================================================
$infoEmail['email'] = '[email protected]';
$infoEmail['senha'] = 'secreto';

$infoEmail['assunto_restaurante'] = "Solicita&ccedil;&atilde;o de reserva para {$nome}";
$infoEmail['mensagem_restaurante'] = "
<p>{$nome} com o e-mail {$email}, deseja efetuar uma reserva para o dia {$dataReserva}, hor&aacute;rio {$horaReserva} para {$qtdPessoas}.</p>

<p>
    <b>Nome:</b> {$nome} <br>
    <b>e-Mail:</b> {$email} <br>
    <b>Data:</b> {$dataReserva} <br>
    <b>Hor&aacute;rio:</b> {$horaReserva} <br>
    <b>N&ordm; de pessoas:</b> {$qtdPessoas}<br>
</p>
";
    
$infoEmail['assunto_cliente'] = 'Restaurante :: Seu pedido foi recebido, aguarde nossa confirma&ccedil;&atilde;o';
$infoEmail['mensagem_cliente'] = "
    <p>Restaurante Romamia :: Seu pedido foi recebido, aguarde nossa confirma&ccedil;&atilde;o</p>
<h3>Dados do seu pedido de reserva:</h3>
<p>
    <b>Nome:</b> {$nome} <br>
    <b>e-Mail:</b> {$email} <br>
    <b>Data:</b> {$dataReserva} <br>
    <b>Hor&aacute;rio:</b> {$horaReserva} <br>
    <b>N&ordm; de pessoas:</b> {$qtdPessoas}<br>
</p>
";

//Regex formato da data
$rgxFormatoData = '/^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/[12][0-9]{3}$/';
preg_match($rgxFormatoData, $dataReserva, $matches);

//Data atual
$hoje = new DateTime( 'now', new DateTimeZone( 'America/Sao_Paulo'));
$hojeMais2Dias = new DateTime(' +2 day');

//Campos preenchidos
if(empty($nome) or empty($email) or empty($dataReserva) or empty($horaReserva) or empty($qtdPessoas)){
    echo '<p style="color: red">Por favor, preencha todos os campos</p>';
}
//A data combina com o formato permitido? 00/00/0000
elseif($matches){
    //O dia escolhido obedece a regra de +2 dias?
    if($dataReserva < $hojeMais2Dias->format('d/m/Y')){
        echo '<p style="color: red">Escolha uma data a partir de ' . $hojeMais2Dias->format('d/m/Y') . '</p>';
    } 
    //Enviar mensagem
    else {        
        //========================================================
        //Mensagem para o restaurante **************************//
        //======================================================== 
        $mail->SMTPDebug = 2;
        $mail_restaurante->isSMTP(); // Set mailer to use SMTP
        $mail_restaurante->Host = 'email-ssl.com.br'; // Specify main and backup SMTP servers
        $mail_restaurante->SMTPAuth = true; // Enable SMTP authentication
        $mail_restaurante->Username = $infoEmail['email']; // SMTP username
        $mail_restaurante->Password = $infoEmail['senha']; // SMTP password
        $mail_restaurante->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
        $mail_restaurante->Port = 587; // TCP port to connect to
        $mail_restaurante->isHTML(true); // Set email format to HTML        
        $mail_restaurante->setFrom($infoEmail['email']);
        
        $mail_restaurante->addAddress($infoEmail['email'], 'Restaurante'); // Add a recipient        
        $mail_restaurante->Subject = $infoEmail['assunto_restaurante']; //Here is the subject
        $mail_restaurante->Body    = $infoEmail['mensagem_restaurante'];//This is the HTML message
        
        if(!$mail_restaurante->send()) {
            echo 'Erro ao enviar e-amil para - Mailer Error: ' . $mail_cliente->ErrorInfo;
        } else {
            
            //====================================================
            //Mensagem para o cliente **************************//
            //====================================================
            $mail->SMTPDebug = 2;
            $mail_cliente->isSMTP(); // Set mailer to use SMTP
            $mail_cliente->Host = 'email-ssl.com.br'; // Specify main and backup SMTP servers
            $mail_cliente->SMTPAuth = true; // Enable SMTP authentication
            $mail_cliente->Username = $infoEmail['email']; // SMTP username
            $mail_cliente->Password = $infoEmail['senha']; // SMTP password
            $mail_cliente->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
            $mail_cliente->Port = 587; // TCP port to connect to
            $mail_cliente->isHTML(true); // Set email format to HTML

            $mail_cliente->setFrom($infoEmail['email']);
            $mail_cliente->addAddress($email, $nome); // Add a recipient        

            $mail_cliente->Subject = $infoEmail['assunto_cliente']; //Here is the subject
            $mail_cliente->Body    = $infoEmail['mensagem_cliente'];//This is the HTML message   

            if(!$mail_cliente->send()) {
                echo 'Erro ao enviar e-amil para ' . $email . ' - Mailer Error: ' . $mail_cliente->ErrorInfo;
            } else {
                echo '<p style="color: green">Mensagem enviada com sucesso!</p>';
                $mail_cliente->ClearAllRecipients();
            }//else cliente
            $mail_restaurante->ClearAllRecipients();
        }//else restaurante         
    }//else validacao
}//elseif matches

 

Script JQuery:

(function ($) {
    var form_reservas = $('#reservas');
    var tema = '/wp-content/themes/restaurante/';
    var script_reservas = tema + 'reservas/reservasRestaurante.php';        
    var status = $('#status-envio'); 
    
    function retorno(data){
        status.hide().html(data).fadeIn();
    }
    
    //Ao clicar em Submit
    form_reservas.submit(function(event){
        event.preventDefault();
        var campos = form_reservas.serializeArray();
        
        //Percorrendo os campos
        $.map(campos, function(campo){
            // ====== Minha enorme validação :P
            } else {
                $.ajax({
                    type: "POST",
                    url: script_reservas,
                    data: campos,
                    beforeSend: function(){
                        status.hide().html('<p style="color: #337AB7"><img src="'+ tema +'images/loading_icon.svg"> Enviando ...</p>').fadeIn();
                    },
                    error: retorno,
                    success: retorno,
                    complete: function(){form_reservas.get(0).reset();}
                });
            }
        });        
    });
})(jQuery);

 

Caixa de entrada.png

Link to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 0

Está enviando várias vezes porque a chamada ao ajax está dentro do map(). O map percorre cada campo e, para cada campo que ele percorre, ele chama o ajax postando a informação e, portanto, enviando um email. 

Um jeito fácil de resolver isso é setando uma variável de controle de erro. Aí depois verifica a variável e depois chama o ajax. Algo mais ou menos assim:

//Percorrendo os campos
var erro_form = false;
$.map(campos, function(campo){
	// ======= Minha enorme validação :P
  	if ( /* algo errado */ ) {
        erro_form = true;
    }
});

if (! erro_form ){
    $.ajax({
        type: "POST",
        url: script_reservas,
        data: campos,
        beforeSend: function(){
            status.hide().html('<p style="color: #337AB7"><img src="'+ tema +'images/loading_icon.svg"> Enviando ...</p>').fadeIn();
        },
        error: retorno,
        success: retorno,
        complete: function(){form_reservas.get(0).reset();}
    });
}

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      149.9k
    • Total Posts
      646.8k
×
×
  • Create New...