Ir para conteúdo

Arquivado

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

DavidQuintal

contact form php charset utf-8

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@David!

Tenta por isso

header("Content-Type: text/html; charset=UTF-8");

Entre as tags <?php ?> e ve se resolve o problema.

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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" />

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites
$headers = "From: " . $senderName . " <" . $senderEmail . ">";
$headers .= PHP_EOL . 'Content-Type: text/html;	charset=UTF-8';

Compartilhar este post


Link para o post
Compartilhar em outros sites

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,

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

desculpe, deixei um parêntese a mais..

 

correção:

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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