IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Kontaktní formulář

Aktivity
Avatar
Georgin
Člen
Avatar
Georgin:27.2.2018 14:47

Ahoj, potřeboval bych vyřešit češtinu v kontaktním formuláři. Nevím proč mi chodí zprávy z webového formuláře se špatnými znaky. Jde o tento web: www.palavaart.cz. Poradíte mi někdo prosím?

 
Odpovědět
27.2.2018 14:47
Avatar
Lasvit
Člen
Avatar
Lasvit:27.2.2018 15:06

Možnosti
<code>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />

mb_internal_en­coding("UTF-8");
</code>
a email hlavička
<code>
Content-Type: text/plain; charset="UTF-8"
</code>

 
Nahoru Odpovědět
27.2.2018 15:06
Avatar
Vít Kološ
Člen
Avatar
Vít Kološ:27.2.2018 16:15

HTML meta charset je na webu Palavaart nastaven správně pomocí

<meta charset="utf-8">

-> není třeba měnit (navíc je to vhodnější než způsob pomocí Content-type).

Záleží, kam ústí formulář. Jestli do emailu, bude to asi hlavička (viz výše), pokud do databáze, bude to kódování databáze. Jinak by mohl být problém také v PHP (mb_internal_en­coding).

Nahoru Odpovědět
27.2.2018 16:15
Neopravuj, co není rozbité.
Avatar
Georgin
Člen
Avatar
Georgin:28.2.2018 10:24

Kódování znaků jsem určil v hlavičce HTML dokumentu

<meta charset="utf-8">

pak jsem kódování doplnil ještě do HTML formuláře

<form id="contactForm" name="sentMessage" accept-charset="UTF-8" novalidate>

a taky do PHP souboru (mimochodem PHP neovládám)

<?php
mb_internal_encoding("UTF-8");
// Check for empty fields
if(empty($_POST['name'])      ||
   empty($_POST['email'])     ||
   empty($_POST['phone'])     ||
   empty($_POST['message'])   ||
   !filter_var($_POST['email'],FILTER_VALIDATE_EMAIL))
   {
   echo "No arguments Provided!";
   return false;
   }

$name = strip_tags(htmlspecialchars($_POST['name']));
$email_address = strip_tags(htmlspecialchars($_POST['email']));
$phone = strip_tags(htmlspecialchars($_POST['phone']));
$message = strip_tags(htmlspecialchars($_POST['message']));

// Create the email and send the message
$to = '[email protected]'; // Add your email address inbetween the '' replacing [email protected] - This is where the form will send a message to.
$email_subject = "Webový kontaktní formulář:  $name";
$email_body = "Mate novou zpravu z weboveho kontaktniho formulare.\n\n"."Zde jsou detaily:\n\nJmeno: $name\n\nEmail: $email_address\n\nTelefon: $phone\n\nZprava:\n$message";
$headers = "From: [email protected]\n"; // This is the email address the generated message will be from. We recommend using something like [email protected].
$headers .= "Reply-To: $email_address";
mail($to,$email_subject,$email_body,$headers);
return true;
?>

a stejně mi chodí zprávy se špatnými znaky.

 
Nahoru Odpovědět
28.2.2018 10:24
Avatar
Lasvit
Člen
Avatar
Odpovídá na Georgin
Lasvit:28.2.2018 10:57

Místo mail použij funkci http://php.net/…end-mail.php, jinak k tomu emailu přidej ještě
<code>
$headers .= "Content-Type: text/plain; charset="UTF-8"";
</code>
a určitě ti to už půjde.

 
Nahoru Odpovědět
28.2.2018 10:57
Avatar
petr.jouza
Člen
Avatar
Odpovídá na Georgin
petr.jouza:28.2.2018 16:22

Ahoj, tento skript je mi nějaký povědomí. Buď jsi to tak trefil nebo ho máš z nějakého webu odkud jsem kdysi čerpal také a také jsem se nazlobil s češtinou.
Výsledek, který já používám a funguje mi je:

$to = '[email protected]' ;
$subject = "=?utf-8?B?".base64_encode('Předmět emailu')."?=" ;
$message = 'Text emailu' ;
$headers = 'MIME-Version: 1.0'."\n" ;
$headers .= 'Content-type: text/html; charset=utf-8'."\n" ;
$headers .= 'From: Jmeno od koho <[email protected]>'."\n" ;
mail($to,$subject,$message,$headers) ;

Vložil jsem jen funkci a jak je naplněna hlavičkou.

Příklad od Lasvit by také pomohl, ale pokud ve formátu emailu máš i nějaké html formátování, tak ti to nevezme, jelikož je Content-Type prostý plaintext. Můj příklad si poradí s češtinou jak v těle emailu, tak i v předmětu. Jen se mi často stává, že zprávy které odešle webhosting přijdou většinou do spamu. Na outlook doménách kolikrát nepřijde vůbec, protože fakticky ten email odesílá webhosting a hlavičkou říkám zobraz email od někoho jiného. Když jsem faktickou emailovou adresu webhostingu dal do výjimek, tak email normálně dorazil i na outlook.

Samozřejmě v mém příkladu jsem ti nekopíroval i případné kontroly zprávy, které mají být samozřejmostí.

 
Nahoru Odpovědět
28.2.2018 16:22
Avatar
Georgin
Člen
Avatar
Georgin:1.3.2018 12:48

Díky za rady, trochu jsem script podle nich poupravil a předmět emailu se mi už zobrazuje česky, text emailu však pořád se špatnými znaky.

<?php
mb_internal_encoding("UTF-8");
if(empty($_POST['name'])      ||
   empty($_POST['email'])     ||
   empty($_POST['phone'])     ||
   empty($_POST['message'])   ||
   !filter_var($_POST['email'],FILTER_VALIDATE_EMAIL))
   {
   echo "No arguments Provided!";
   return false;
   }

$name = strip_tags(htmlspecialchars($_POST['name']));
$email_address = strip_tags(htmlspecialchars($_POST['email']));
$phone = strip_tags(htmlspecialchars($_POST['phone']));
$message = strip_tags(htmlspecialchars($_POST['message']));

$to = '[email protected]';
$email_subject = "=?utf-8?B?".base64_encode('Webový kontaktní formulář')."?=";
$email_body = "Máte novou zprávu z webového kontaktního formuláře.\n\n"."Zde jsou detaily:\n\nJmeno: $name\n\nEmail: $email_address\n\nTelefon: $phone\n\nZprava:\n$message";
$headers = 'MIME-Version: 1.0'."\n";
$headers .= 'Content-type: text/html; charset=utf-8'."\n";
$headers = "From: [email protected]\n";
$headers .= "Reply-To: $email_address";
mail($to,$email_subject,$email_body,$headers);
return true;
?>
 
Nahoru Odpovědět
1.3.2018 12:48
Avatar
Lasvit
Člen
Avatar
Odpovídá na Georgin
Lasvit:1.3.2018 13:05

Jak jsem již psal.... použij http://php.net/…end-mail.php

Editováno 1.3.2018 13:05
 
Nahoru Odpovědět
1.3.2018 13:05
Avatar
Odpovídá na Georgin
Dominik Gavrecký:1.3.2018 13:18

Skus "\r\n" nahradiť za PHP_EOL

Nahoru Odpovědět
1.3.2018 13:18
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Petr Čech
Tvůrce
Avatar
Petr Čech:1.3.2018 14:14

Ano, v mailu se používá \n.
A lepší než se pachtit s hlavičkami ručně je použít hotové řešení, třeba PHPMailer nebo Swiftmailer

Nahoru Odpovědět
1.3.2018 14:14
the cake is a lie
Avatar
petr.jouza
Člen
Avatar
Odpovídá na Georgin
petr.jouza:1.3.2018 20:59

Já teda ve svém skriptu nepoužívám ten

mb_internal_encoding("UTF-8");

Pokud máš celou stránku a soubor kódovaný v UTF-8, tak je to zbytečné.

Zkus případně ještě vyhodit

$headers .= "Reply-To: $email_address";

to já nepoužívám a ani ti to k ničemu moc není. Mail stejně posíláš jen jednou a to na předem přesně zadaný email v $to.

Ještě se mi nelíbí toto

headers = "From: [email protected]\n";

Já bych to použil spíš takto:

headers = 'From: INFO palavaart.cz <[email protected]>'."\n";

ale asi by to mělo být jedno.

Pak pokud máš mail kódovaný v Content-type: text/html, tak trochu postrádají smysl htmlspecialchars(), ten ti odstraní HTML značky a převede ti je na entity (klasické znaky). Spíš bych použil pro odstranění HTML značek strip_tags(), pokud chceš řetězec bez HTML znaků.

 
Nahoru Odpovědět
1.3.2018 20:59
Avatar
Šimon Rataj
Člen
Avatar
Šimon Rataj:2.3.2018 15:45

Já vřele doporučuji phpMailer(https://github.com/…er/PHPMailer), umí to i autentizaci přes SMTP a odesílání příloh, tam stačí jen dát:

$mail->CharSet = "UTF-8";
 
Nahoru Odpovědět
2.3.2018 15:45
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.