Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

nocrovaldo

[Resolvido] Envio de Form

Recommended Posts

Saudações galera!

Sou Marcos Sá, e estou a muitos meses aprendendo sobre HTML5 - CSS - PHP - AJAX .. Eu sei que é pouco tempo de aprendizado para essa nova Skil que estou gravando em minha massa massa encefálica. Vamos ao caso.

 

1 - Meu site está hospedado na locaweb.

2 - Com a ajuda do google, encontrei um form bacana para iniciar.

3 - Minha ideia inicial era enviar os dados via POST sem dar refresh na página toda, e sim somente, na section do form propriamente dita.

4 - Outra questão era colocar o "reCAPTCHA", da google, para evitar os malas de plantão.

5 - E que todo o site fosse responsivo.

 

O problema: 

Toda vez que o form é enviado os acentos não são respeitados. Vai que vai na loucu~~12~3ra só heheh

 

Segue as declarações do php em questão abaixo:

<?php
// require ReCaptcha class
require('recaptcha-master/src/autoload.php');

// configure
if (isset($_POST['txtdest']))
{
    // $destino = $_POST['txtdest'];
    // $assunto = $_POST['txtass'];
    // $mensagem = $_POST['txtmsg'];
    if (PATH_SEPARATOR ==":") {
        $quebra = "\r\n";
    } else {
        $quebra = "\n";
    }
    $headers = "MIME-Version: 1.1".$quebra;
    $headers .= "Content-type: text/html; charset=utf-8" .$quebra;
    $headers .= "From: contato@site.com.br".$quebra;
    $headers .= "Return-Path: ";

}


$sendTo = 'Site <contato@site.com.br>';
$subject = 'Contato Pelo Site';
$fields = array('name' => 'Name', 'message' => 'Message'); // array variable name => Text to appear in the email
$okMessage = 'Formulário enviado com sucesso.';
$errorMessage = 'Houve um erro no envio, por favor, verificar o reCAPTCHA.';
$recaptchaSecret = '********************';

// let's do the sending

try
{
    if (!empty($_POST)) {

        // validate the ReCaptcha, if something is wrong, we throw an Exception,
        // i.e. code stops executing and goes to catch() block

        if (!isset($_POST['g-recaptcha-response'])) {
            throw new \Exception('ReCaptcha is not set.');
        }

        // do not forget to enter your secret key in the config above
        // from https://www.google.com/recaptcha/admin

        $recaptcha = new \ReCaptcha\ReCaptcha($recaptchaSecret, new \ReCaptcha\RequestMethod\CurlPost());

        // we validate the ReCaptcha field together with the user's IP address

        $response = $recaptcha->verify($_POST['g-recaptcha-response'], $_SERVER['REMOTE_ADDR']);


        if (!$response->isSuccess()) {
            throw new \Exception('ReCaptcha was not validated.');
        }

        // everything went well, we can compose the message, as usually

        $emailText = "Nova Mensagem.\n=============================\n";

        foreach ($_POST as $key => $value) {

            if (isset($fields[$key])) {
                $emailText .= "$fields[$key]: $value\n";
            }
        }

    mail($sendTo, $subject, $emailText, $headers, "-r". "contato@site.com.br");

    $responseArray = array('type' => 'success', 'message' => $okMessage);


    }
}
catch (\Exception $e)
{
    $responseArray = array('type' => 'danger', 'message' => $errorMessage);
}

if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    $encoded = json_encode($responseArray);

    header('Content-Type: application/json');

    echo $encoded;
}
else {
    echo $responseArray['message'];
}

 

Nota* = Todos os Html

Spoiler
Spoiler

 

 

 estão com a declaração <meta charset="utf-8">

 

Nota** = no php.ini também está declarado da seguinte forma:

 default_charset = "utf-8"
internal_encoding = 'utf-8'
output_encoding = 'utf-8'

 

Onde será que estou pecando amigos? 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu banco está na linguagem UTF8? Você está tendo dificuldades em gravar no banco ou exibir?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aaaah, entendi agora, você não tá inserindo registros no banco né? E sim apenas enviando o e-mail... Não é isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites
$okMessage = '=?UTF-8?B?'.base64_encode('Formulário enviado com sucesso.').'?=';

Já tentou?

Compartilhar este post


Link para o post
Compartilhar em outros sites

De onde você está pegando o valor "Name" e "Message"?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, inicialmente ele está pegando do form:

 

<fieldset>
    <form id="contact-form" role="form"  method="post" class="contactForm" action="contact.php">
        <div class="messages"></div>
        <div class="row">
            <div class="col-md-6">
                <div class="form-group">
                    <label for="form_name">Nome</label>
                    <input type="text" name="name" class="form-control" id="form_name" placeholder="Nome" data-rule="minlen:4" data-msg="Please enter at least 4 chars" />
                    <div class="help-block with-errors"></div>
                </div>


                <div class="col-md-60">
                    <div class="form-group">
                        <label for="form_message">Mensagem</label>
                        <textarea class="form-control" name="message" id="form_message" rows="5" data-rule="required" data-msg="Please write something for us" placeholder="Mensagem" required=""></textarea>
                        <div class="help-block with-errors"></div>
                    </div>
                </div>
                <div class="g-recaptcha" data-sitekey="*******************************"></div>

                <div class="col-md-12">
                    <button type="submit" class="btn btn-skin pull-right" id="btnContactUs" value="Send message">
                        Enviar Mensagem</button>

Tem o complemento do script ajax :

 

 

$(function () {

    $('#contact-form').validator();

    $('#contact-form').on('submit', function (e) {
        if (!e.isDefaultPrevented()) {
            var url = "contact.php";

            $.ajax({
                type: "POST",
                url: url,
                data: $(this).serialize(),
                success: function (data)
                {
                    var messageAlert = 'alert-' + data.type;
                    var messageText = data.message;

                    var alertBox = '<div class="alert ' + messageAlert + ' alert-dismissable"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>' + messageText + '</div>';
                    if (messageAlert && messageText) {
                        $('#contact-form').find('.messages').html(alertBox);
                        $('#contact-form')[0].reset();
                        grecaptcha.reset();
                    }
                }
            });
            return false;
        }
    })
});

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, você está enviando de um form por método POST, mas no código que me mandou, no arquivo que envia o e-mail, eu não estou vendo a declaração do método: $name = $_POST['name'];

Compartilhar este post


Link para o post
Compartilhar em outros sites

Jesse, seria esse !

$fields = array('name' => 'Name', 'message' => 'Message');

Mais abaixo ... 

$emailText = "Nova Mensagem.\n=============================\n";

        foreach ($_POST as $key => $value) {

            if (isset($fields[$key])) {
                $emailText .= "$fields[$key]: $value\n";
            }
        }

 

 mail($sendTo, $subject, $emailText, $headers, "-r". "contato@site.com.br");

    $responseArray = array('type' => 'success', 'message' => $okMessage);


    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Troque: 

$fields = array('name' => 'Name', 'message' => 'Message');

Por:

$fields = array('name' => $name, 'message' => $message);

 

E mude isso:

<?php
// require ReCaptcha class
require('recaptcha-master/src/autoload.php');

// configure
....

Pra isso:

<?php
$name = $_POST['name'];
$message = $_POST['message'];
// require ReCaptcha class
require('recaptcha-master/src/autoload.php');

// configure
....

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, agora podemos prosseguir, já que agora está pegando os dados do formulário e repassando, agora altere o seguinte:

 

mail($sendTo, $subject, $emailText, $headers, "-r". "contato@site.com.br");

Para:

mail("$sendTo", "$subject", "$emailText", "$headers");

 

E:

	$headers = "MIME-Version: 1.1".$quebra;
    $headers .= "Content-type: text/html; charset=utf-8" .$quebra;
    $headers .= "From: contato@site.com.br".$quebra;
    $headers .= "Return-Path: ";

Para:

$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n";
$headers .= "From: $name";

 

Vê se funciona!

Compartilhar este post


Link para o post
Compartilhar em outros sites

@nocrovaldo, seja bem-vindo!

 

1 - Certificou-se de o encoding do seu arquivo físico (manipulado através da sua IDE/editor de textos) esteja definido como UTF-8?

2 - Certificou-se de que as colunas (não as tabelas, como você postou), sejam utf8?

3 - Se você exibe as informações do banco diretamente na tela antes do envio do e-mail, os acentos estão corretos?

 

Se tudo isso estiver padronizado, algum detalhe relacionado ao encoding ainda está passando despercebido por nós, mas provavelmente você pode contornar isso utilizando o seguinte, como exemplo:

mail($sendTo, $subject, utf8_encode( $emailText ), $headers, "-r". "contato@site.com.br");

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Jesse, fiz alterações conforme sua orientação. Mas agora o envio não foi efetuado.

 

O site está hospedado pela Locaweb, e segundo eles, é necessário seguir o cabeçalho  com as seguintes declarações

 

Forma de envio Locaweb:

<?php


if (isset($_POST['txtdest']))
{
   $destino = $_POST['txtdest'];
   $assunto = $_POST['txtass'];
   $mensagem = $_POST['txtmsg'];
   if (PATH_SEPARATOR ==":") {
      $quebra = "\r\n";
   } else {
      $quebra = "\n";
   }
   $headers = "MIME-Version: 1.1".$quebra;
   $headers .= "Content-type: text/html; charset=utf-8".$quebra;
   $headers .= "From: contato@site.com.br".$quebra; //E-mail do remetente
   $headers .= "Return-Path: contato@site.com.br".$quebra; //E-mail do remetente
   mail($destino, $assunto, $mensagem, $headers, "-r". "contato@site.com.br");
   print "Mensagem enviada com sucesso!";

A partir dessa base, que fui alterando as declarações no meu form para que funcionasse conforme a convenção internacional RFC 822. Alias, se não for configurado dessa maneira acima, o envio não funciona, com a alegação que os servidores deles bloqueiam. 

 

 

Outra informação interessante.  Se eu hospedar esse mesmo Form em outro site de hospedagem, como por exemplo o "https://br.000webhost.com/", eu recebo o email sem esse problema de acentos .

 

Eu não consigo imaginar o que poderia ser ... 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Matheus! Obrigado pela recepção.

 

Conforme sua orientação, o erro continua. 

 

 IDE/editor de textos está sim, conforme a imagem.

Sobre o item 2, acho que nunca acessei essa funcionalidade

3 - Não, acesso o site e faço os testes diretamente nele. Preencho o form e clico em enviar. Todos os acentos dentro dos campos antes de clicar em enviar ficam corretos.

5.png

6.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já entrou em contato com o suporte da Locaweb? Pode ser não, É configuração deles, já que em outros hosts funciona com acentuação, creio que o suporte deles irá atender melhor seu problema, mas pesquisarei por aqui para te ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que você não entendeu o item 3... quis dizer para você fazer esse teste:

Antes do mail() rode um:

echo $emailText;

 para exibir o texto na tela e verificar se ele está bugando os acentos também, ou se é apenas no e-mail.

 

Sobre o banco, cometi a mesma falha de atenção do Jesse. Você não o está utilizando, então podemos ignorar isso.

 

Engraçado o utf8_encode não ter funcionado. Você consegue ler a mensagem original do e-mail? Isso vai depender do seu cliente de e-mail.

No Gmail, por ex, basta ir na setinha com opções relacionadas ao e-mail e clicar em "Mostrar Original". Isso vai te dar detalhes sobre a mensagem e seu encoding. Veja em anexo.

 

Veja se ajuda também: https://stackoverflow.com/questions/19708097/php-mail-special-characters-utf8

 

Eu iria sugerir utilizar um cliente para o envio do e-mail, como o PHPMailer, que oferece um leque maior de configurações para encoding, autenticação, etc. Isso inclusive evitaria cair na caixa de SPAM e é mais eficiente para envio de mensagens sequenciais (caso você deseje fazer isso futuramente), o que está inclusive escrito no próprio manual da função mail().

Captura de Tela 2017-11-09 às 18.55.50.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

Jesse, desde já agradeço sua ajuda =] 

 

Eu entrei em contato com eles e eles foram bem direto em dizer que isso é escopo para a equipe de desenvolvimento do site ( ou seja, meu problema).  Mas fora isso, o suporte foi bem atencioso e ajudou na medida do possível.

 

Bem, como sou nosso nessa caminha, a ignorância por minha parte me limita um pouco pra argumentar sobre o problema com suporte, se sentir inferior é chato =/ 

 

Mas eu não vou desistir não. Uma hora vou entender e esbarrar em uma solução. Estou aqui e em sites de pesquisas lendo sobre o assunto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a ajuda dos amigos, mas preciso entender uma processo que não estou conseguindo sucesso.

      Como mencionado no Título estou escrevendo um Sistema Web para Gerenciamento de Empresa.
       
      Minha dúvida, que preciso muito entender:
      - preciso agora escrever a Rotina para Emissão de NFe e essa parte não estou conseguindo.
       
      tenho assistido alguns vídeos e leituras, mas não estou conseguindo sucesso, já fiz toda as importações das LIB da NFePhp conforme orientação.

      Preciso de ajuda.

      Algum dos amigos tem conhecimento de algum passo-a-passo explicando a criação dessa rotina ?

      tenho visto alguns vídeos com LARAVEL, mas quando tento utilizar e converter para PHP+Codeiginter, dá uma fila de erros que não entendo, mesmo informando as lib necessárias.

      Alguns do amigo tem algum vídeo, leitura explicando essa parte ?

      Grato,

      Cesar.
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer ao auxílio dos amigos, mas preciso entender e resolver um problema.
       
      Tenho uma Rotina que o usuário seleciona os produtos que deseja para requerer ao setor responsável.
       
      O usuário escolhe um produto qualquer e Clicla em um button para incluir a lista.

      O problema que estou enfrentando é que após escolher o produto e teclar ENTER o Sistema já salva no BD.
       
      Gostaria de criar uma Tecla de Atalho, para quando incluir/escolher o produto na lista, o usuário tecla como exemplo:
      ALT+A  para agregar a lista
      ALT+S para salvar a lista de itens desejados.

      Assim, quando teclar enter, o sistema não dispara o GRAVAR na Base de Dados.

      Grato,

      Cesar
       
       
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.