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 daemon
      Boa tarde,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, e mostrar a imagem que esta na pagina do link.
      Para isso utilizo esta função:
      function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; }  
      Mas estou com um problema, esta funcão funciona quando coloco em uma pagina de teste.php. Preciso mostrar em uma página inicial diversas fotos de todos os links. (No caso acima só funciona 1).
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
×

Informação importante

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