Ir para o conteúdo

Publicidade

 Estatísticas do Fórum

  • 0 Usuários ativos

    0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

Foto:

contact form php charset utf-8

  • Por favor, faça o login para responder
18 respostas neste tópico

#1 DavidQuintal

DavidQuintal
  • Membros
  • 9 posts

Postado 28 agosto 2011 - 13:58

Ola Pessoal.

Estou a ter um problema com um formulário em php.

Quando recebo os e-mail desse formulário ele não detecta a acentuação (charset="utf-8").

Alguém pode ajudar neste código

<?php

// Define some constants
define( "RECIPIENT_NAME", "John Smith" );
define( "RECIPIENT_EMAIL", "exemple@msn.com" );
define( "EMAIL_SUBJECT", "Visitor Message" );

// Read the form values
$success = false;
$senderName = isset( $_POST['senderName'] ) ? preg_replace( "/[^\.\-\' a-zA-Z0-9]/", "", $_POST['senderName'] ) : "";
$senderEmail = isset( $_POST['senderEmail'] ) ? preg_replace( "/[^\.\-\_\@a-zA-Z0-9]/", "", $_POST['senderEmail'] ) : "";
$message = isset( $_POST['message'] ) ? preg_replace( "/(From:|To:|BCC:|CC:|Subject:|Content-Type:)/", "", $_POST['message'] ) : "";

// If all values exist, send the email
if ( $senderName && $senderEmail && $message ) {
  $recipient = RECIPIENT_NAME . " <" . RECIPIENT_EMAIL . ">";
  $headers = "From: " . $senderName . " <" . $senderEmail . ">";
  $success = mail( $recipient, EMAIL_SUBJECT, $message, $headers );
}

// Return an appropriate response to the browser
if ( isset($_GET["ajax"]) ) {
  echo $success ? "success" : "error";
} else {
?>
<html>
  <head>
    <title>Thanks!</title>
  </head>
  <body>
  <?php if ( $success ) echo "<p>Thanks for sending your message! We'll get back to you shortly.</p>" ?>
  <?php if ( !$success ) echo "<p>There was a problem sending your message. Please try again.</p>" ?>
  <p>Click your browser's Back button to return to the page.</p>
  </body>
</html>
<?php
}
?>



Se alguém poder ajudar agradecia.
  • 0

#2 Dii

Dii
  • Membros
  • 414 posts

Postado 28 agosto 2011 - 20:24

@David!
Tenta por isso
header("Content-Type: text/html; charset=UTF-8");

Entre as tags <?php ?> e ve se resolve o problema.
Abraços!
  • 0

#3 DavidQuintal

DavidQuintal
  • Membros
  • 9 posts

Postado 28 agosto 2011 - 21:00

Boas Dii,

Eu tentei essa tag mas o erro continua.

Continuo a receber os e-mails sem acentuação.

Existe alguma maneira de contornar esse erro?

O Formulario de origem é esse.
  • 0

#4 Dii

Dii
  • Membros
  • 414 posts

Postado 28 agosto 2011 - 21:07

Esses dados estão vindo de um banco de dados?
  • 0

#5 gustavo21126

gustavo21126
  • Membros
  • 42 posts

Postado 28 agosto 2011 - 21:09

la onde esta localizado o fomulario procure uma linha parecida com essa
<meta http-equiv="Content-Type" content="text/html; charset=ISO" />

e mude para esta
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />

  • 0

#6 Dii

Dii
  • Membros
  • 414 posts

Postado 28 agosto 2011 - 21:17

Ou melhor...
Mude...
<meta http-equiv="Content-Type" content="text/html; charset=ISO" />


Por isso aqui
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />


Ve se muda algo. Valeu
  • 0

#7 DavidQuintal

DavidQuintal
  • Membros
  • 9 posts

Postado 28 agosto 2011 - 22:31

Olá Dii,

Não estou a utilizar banco de dados.Simplesmente coloque o ficheiros na pasta public html do meu servidor.

O site está a ser desenvolvido em html5 com o charsert assim:
<!DOCTYPE HTML>
<html lang="pt">
<head>
    <meta charset="utf-8">

Acho que o problema se encontra nesta parte do código:

// Read the form values
$success = false;
$senderName = isset( $_POST['senderName'] ) ? preg_replace( "/[^\.\-\' a-zA-Z0-9]/", "", $_POST['senderName'] ) : "";
$senderEmail = isset( $_POST['senderEmail'] ) ? preg_replace( "/[^\.\-\_\@a-zA-Z0-9]/", "", $_POST['senderEmail'] ) : "";
$message = isset( $_POST['message'] ) ? preg_replace( "/(From:|To:|BCC:|CC:|Subject:|Content-Type:)/", "", $_POST['message'] ) : "";

// If all values exist, send the email
if ( $senderName && $senderEmail && $message ) {
  $recipient = RECIPIENT_NAME . " <" . RECIPIENT_EMAIL . ">";
  $headers = "From: " . $senderName . " <" . $senderEmail . ">";
  $success = mail( $recipient, EMAIL_SUBJECT, $message, $headers );
}

Se quiser da uma olhada no formulário original esse é o link


Valeu
  • 0

#8 hinom

hinom
  • Membros
  • 15.042 posts

Postado 28 agosto 2011 - 23:52

$headers = "From: " . $senderName . " <" . $senderEmail . ">";

$headers .= PHP_EOL . 'Content-Type: text/html;	charset=UTF-8';

  • 0

#9 DavidQuintal

DavidQuintal
  • Membros
  • 9 posts

Postado 29 agosto 2011 - 06:45

Boas Hinom,

O código que postaste serve para o conteúdo do email.
Agora estou a tentar descobrir porque o assunto do email ainda vem sem acentos.
Muito obrigado pela ajuda.

Valeu Hionm,
  • 0

#10 hinom

hinom
  • Membros
  • 15.042 posts

Postado 29 agosto 2011 - 11:42

se não me engano postei recentemente num outro tópico



[edit]
aqui
http://forum.imaster...ost__p__1748505

Editado por hinom, 29 agosto 2011 - 11:43 .

  • 0

#11 DavidQuintal

DavidQuintal
  • Membros
  • 9 posts

Postado 29 agosto 2011 - 12:26

Boas Hinom,

Eu sou designer e não recebo nada de php.

Tentei por no código assim mas não dá

<?php

// Define some constants
define( "RECIPIENT_NAME", "Porta 33" );
define( "RECIPIENT_EMAIL", "xarkan@msn.com" );
define( "EMAIL_SUBJECT", "Comentarios Porta33" );

// Read the form values
$success = false;
$senderName = isset( $_POST['senderName'] ) ? preg_replace( "/[^\.\-\' a-zA-Z0-9]/", "", $_POST['senderName'] ) : "";
$senderEmail = isset( $_POST['senderEmail'] ) ? preg_replace( "/[^\.\-\_\@a-zA-Z0-9]/", "", $_POST['senderEmail'] ) : "";
$message = isset( $_POST['message'] ) ? preg_replace( "/(From:|To:|BCC:|CC:|Subject:|Content-Type:)/", "", $_POST['message'] ) : "";

// If all values exist, send the email 
if ( $senderName && $senderEmail && $message ) {
  $recipient = RECIPIENT_NAME . " <" . RECIPIENT_EMAIL . ">";

function foo( $label, $charset = 'utf-8' ){
return '=?' . $charset . '?B?' . base64_encode( $label ) . '?=';
}
	$header = 'From: ' . foo( $senderName ) . '<' . $senderEmail . '>';
	$header .= PHP_EOL . 'Content-type: text/plain; charset=utf-8';
	$success = mail( $recipient, EMAIL_SUBJECT, $message, $headers );
}

// Return an appropriate response to the browser
if ( isset($_GET["ajax"]) ) {
  echo $success ? "success" : "error";
} else {
?>
<html>
  <head>
    <title>Thanks!</title>
  </head>
  <body>
  <?php if ( $success ) echo "<p>Thanks for sending your message! We'll get back to you shortly.</p>" ?>
  <?php if ( !$success ) echo "<p>There was a problem sending your message. Please try again.</p>" ?>
  <p>Click your browser's Back button to return to the page.</p>
  </body>
</html>
<?php
}
?>

Podes ajudar nesse codio?

Valeu
  • 0

#12 hinom

hinom
  • Membros
  • 15.042 posts

Postado 29 agosto 2011 - 13:05

um dos problemas está na filtragem da variável que recebe o nome do remetente


$senderName = isset( $_POST['senderName'] ) ? preg_replace( "/[^\.\-\' a-zA-Z0-9]/", "", $_POST['senderName'] ) : "";
essa regra regex permite apenas caracteres alfa-numéricos, não permitindo, por exemplo, caracteres especiais (que possuem acentuação ou cedilha, etc..)


para comprovar, faça uma teste num arquivo separado:

tmp.php
<?php
$senderName = 'Mário';
echo preg_replace( "/[^\.\-\' a-zA-Z0-9]/", "", $senderName );
// imprimirá "Mrio"
?>



para "resolver", troque esse trecho
$senderName = isset( $_POST['senderName'] ) ? preg_replace( "/[^\.\-\' a-zA-Z0-9]/", "", $_POST['senderName'] ) : "";
por esse

$senderName = isset( $_POST['senderName'] ) ? trim( $_POST['senderName'] ) ) : '';

Isso apenas removerá espaços em branco do começo e no final da string, caso existam.
É necessário fazer outros tipos de filtragem também. Isso é apenas uma dica de onde começar a consertar e implementar.

Há vários outros pontos no script que precisam ser corrigidos, mas por hora isso resolve o foco principal do tópico.
  • 0

#13 DavidQuintal

DavidQuintal
  • Membros
  • 9 posts

Postado 29 agosto 2011 - 13:38

Olá Hinom,

A solução

A solução que indicastes
$senderName = isset( $_POST['senderName'] ) ? trim( $_POST['senderName'] ) ) : '';
da erro ao enviar o formulário.

Obrigada pela tua atenção.
  • 0

#14 hinom

hinom
  • Membros
  • 15.042 posts

Postado 29 agosto 2011 - 14:25

desculpe, deixei um parêntese a mais..

correção:
$senderName = isset( $_POST['senderName'] ) ? trim( $_POST['senderName']  ) : '';

  • 0

#15 DavidQuintal

DavidQuintal
  • Membros
  • 9 posts

Postado 29 agosto 2011 - 20:54

Continua a enviar enviar o nome sem a acentuação.

:(

Alguém pode ajudar com este problema do formulário?

Editado por Mário Monteiro, 29 agosto 2011 - 21:32 .

  • 0

#16 hinom

hinom
  • Membros
  • 15.042 posts

Postado 29 agosto 2011 - 22:57

adicione essas duas linhas abaixo de senderName..

$senderName = isset( $_POST['senderName'] ) ? trim( $_POST['senderName']  ) : '';

echo mb_detect_encoding() . '<br />';
echo $senderName; exit;


apenas para criar um breakpoint, debugar



outra coisa importante.. não fique esperando que alguém faça o seu trabalho.

mostre que você está tentando resolver também
  • 0

#17 DavidQuintal

DavidQuintal
  • Membros
  • 9 posts

Postado 29 agosto 2011 - 23:31

Boas Hinom,

Desculpa lá o tempo perdido a responder as minhas duvidas.

Eu tentei resolver, mas não consegui.Tentei adaptar outro formulário nesse mas não deu nada.

A tua ultima dica também não deu em nada.

Muito obrigado pela colaboração.



Com os melhores cumprimentos,

David
  • 0

#18 hinom

hinom
  • Membros
  • 15.042 posts

Postado 30 agosto 2011 - 00:04

a ultima dica não serve para resolver o problema, mas sim para depurar, verificar, averiguar como está o ambiente onde está executando o script


echo mb_detect_encoding()
retorna o tipo de encoding que está utilizando.


echo $senderName;
retorna o valor da variável, para verificar se está vindo corretamente antes de usá-la na função mail()


exit;
serve como um breakpoint, para interromper o restante do script


se estiver executando por meio de um browser e não conseguir ver o resultado do breakpoint, mande exibir o código fonte do browser, pois pode ter sido impresso entre tags html, impedindo a visualização
  • 0

#19 DavidQuintal

DavidQuintal
  • Membros
  • 9 posts

Postado 30 agosto 2011 - 01:33

Caro Hinom,

Obrigado pela atenção. Não tenho nenhuma formação em php. Sou de artes plásticas, tentei muita coisa mas não deu em nada.

Vou ver se pego um formulário que admita caracteres latinos.

Muito obrigado pela sua colaboração.


Com os melhores cumprimentos,

David
  • 0