Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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);
}
} $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;
} 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?Jesse, segue dois prints.
Toda informação enviado pelo form fica gravado no banco de dados?

Aaaah, entendi agora, você não tá inserindo registros no banco né? E sim apenas enviando o e-mail... Não é isso?
Isso isso isso Jesse. Um formulário de envio simples, no estilo fale conosco.
Perdão! Peço desculpa pela omissão dessa informação.
$okMessage = '=?UTF-8?B?'.base64_encode('Formulário enviado com sucesso.').'?=';
Já tentou?$okMessage = '=?UTF-8?B?'.base64_encode('Formulário enviado com sucesso.').'?=';
Sim Jesse, o erro persiste.

De onde você está pegando o valor "Name" e "Message"?
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">×</button>' + messageText + '</div>';
if (messageAlert && messageText) {
$('#contact-form').find('.messages').html(alertBox);
$('#contact-form')[0].reset();
grecaptcha.reset();
}
}
});
return false;
}
})
});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'];
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);
}
}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
....
Jesse, foi feita a alteração, mas o problema ainda persiste.

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!@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");
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/](https://br.000webhost.com/)", eu recebo o email sem esse problema de acentos .
Eu não consigo imaginar o que poderia ser ...Olá Matheus! Obrigado pela recepção.
Conforme sua orientação, o erro continua.
O 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.

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.
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](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().

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.
Matheus, já já passo o feedback. Estou fazendo teste baseado no link que você passou.
Matheus, vou por partes.
Inseri o echo $emailText; antes do mail e saiu o seguinte resultado:
Já na caixa do email:


Agora, usando o script da locaweb, a coisa muda de figura. Segue ...
<?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!";
}else{ ?>
<html>
<head>
<meta charset="utf-8">
<title>Mail - PHP</title>
<style type="text/css">
#Text1
{
width: 287px;
}
#Text2
{
width: 287px;
}
#Text3
{
width: 287px;
}
#Text4
{
width: 287px;
}
#btEnviar
{
width: 100px;
}
#btLimpar
{
width: 100px;
}
#TextArea1
{
width: 287px;
}
</style>
</head>
<body>
<form id="form" name="form" method="POST" action="tt.php">
<h2 align="center" style="text-decoration: underline"> Formulário de Contato (Mail - PHP)</h2>
<table width="450px" align="center" border="1" cellpadding="5" cellspacing="5">
<tr>
<td align="right">
Email Destinatário:</td>
<td>
<input id="txtdest" name="txtdest" type="text" /></td>
</tr>
<tr>
<td align="right">
Assunto:</td>
<td>
<input id="txtass" name="txtass" type="text" /></td>
</tr>
<tr>
<td align="right">
Mensagem:</td>
<td>
<textarea id="txtmsg" name="txtmsg" rows="2"></textarea></td>
</tr>
<tr>
<td align="center" colspan="2">
<table style="width:100%;" cellspacing="10">
<tr>
<td align="right">
<input id="btEnviar" type="submit" value="Enviar" /></td>
<td>
<input id="btLimpar" type="reset" value="Limpar" align="left" /></td>
</tr>
</table>
</td>
</tr>
</table>
</form>
</body>
</html>
<?php } ?>
Retorno no email:

Galera, tive um pequeno avanço.
Inicialmente em meu php, eu tinha essa declaração aqui
if (isset($_POST['txtdest']))
{
$destino = $_POST['txtdest'];
$assunto = $_POST['txtass'];
$mensagem = $_POST['txtmsg'];
if (PATH_SEPARATOR ==":") {
$quebra = "\r\n";
} else {
$quebra = "\n";
}
Removi o if (isset($_POST[ ... e deixei assim:
if (PATH_SEPARATOR == ":") {
$quebra = "\r\n"; $quebra = "\n";
}
Com essa modificação, os acentos estão aparecendo na caixa de email corretamente ... só que ... o danado agora não pula a linha ¬¬
Alguma ideia porque aconteceu esse fenômeno?

Amigo, apaga isso:
if (PATH_SEPARATOR ==":") {
$quebra = "\r\n";
} else {
$quebra = "\n";
}
E onde estiver sendo utilizado a variável $quebra, você substitui pela constante nativa PHP_EOL.
Veja:
Como você definiu nos headers que utilizará text/html, tome vantagem disso e utilize <br> para quebrar linha.
Testa aí:
$mensagem = nl2br( $_POST['txtmsg'] );
Veja: [http://php.net/manual/pt_BR/function.nl2br.php](http://php.net/manual/pt_BR/function.nl2br.php)Matheus, olhei seu links é o resultado foi positivo \o/
Conforme sua orientação eu fiz o seguinte :
Cabeçalho .$quebra
$headers = "MIME-Version: 1.1".PHP_EOL;
$headers .= "Content-type: text/html; charset=utf-8" .PHP_EOL;
$headers .= "From: contato@site.com.br".PHP_EOL;
$headers .= "Return-Path: ";
eu não sei se o .PHP_EOL está da forma correta, pois ainda fiquei na duvida sobre a função nativa dele.
Os /n
$emailText = "Nova Mensagem.<br />=============================<br />";
foreach ($_POST as $key => $value) {
if (isset($fields[$key])) {
$emailText .= "$fields[$key]: $value<br />";
}
}
todos os /n foram alterados para <br />
no anexo, tem o antes e depois das alterações.
Agora, antes de finalizar o post, teria uma ideia do porque que locaweb declarou esse
if (PATH_SEPARATOR ==":") {
$quebra = "\r\n";
} else {
$quebra = "\n";
}
, se o mesmo apresentou o erro nos acentos?
Ah, obrigado pela ajuda Jesse e Matheus =]

Então, @nocrovaldo, sabe as quebras de linhas que temos nos computadores?
Se você abre o editor de texto e aperta [ENTER] ele pula uma linha, mas por trás disso existe uma representação computacional, que é convertida aos nossos olhos.
No Windows essa quebra de linha é representada por \r\n. No Linux é só \n.
No cabeçalho do e-mail precisamos indicar essas quebras para cada linha de informação. O PHP_EOL é uma regra interna do PHP que verifica o OS e atribui o valor correto relacionado à isso.
O script que você pegou da locaweb fazia exatamente essa simulação, porém desnecessária, já que o PHP já tem isso definido para auxiliar.
Talvez por estar incorreto antes, a informação do encoding não estava sendo processada corretamente... mas que bom que agora está funcionando!
Seu banco está na linguagem UTF8? Você está tendo dificuldades em gravar no banco ou exibir?