Diskuze: Kontaktní formulář
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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_encoding).
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.
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.
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í.
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;
?>
Jak jsem již psal.... použij http://php.net/…end-mail.php
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ů.
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";
Zobrazeno 12 zpráv z 12.