Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno PHP formulářem vygenerovaný e-mail přijde se špatnou diakritikou

Snažím se přes PHP vyřešit vygenerování formuláře, ten se vygeneruje a odešle na mail v pohodě, ale dorazí se špatným kódováním. V potvrzujícím formuláři mám následující proměnné:

$kurz = $_POST['kurz'];
$kodovanikurzu = base64_encode ($kurz);
$kurz = "=?windows-1250?B?$kodovanikurzu?=\r\n";
$jmeno = $_POST['jmeno'];
$prijmeni = $_POST['prijmeni'];
$ulice = $_POST['ulice'];
$mesto = $_POST['mesto'];
$psc = $_POST['psc'];
$telefon = $_POST['telefon'];
$email = $_POST['email'];
$vzkaz = $_POST['vzkaz'];
$spam = $_POST['spam'];

Proměnná kurz v tomto případě slouží jako předmět mailu, ten jsem ošetřil proměnnou kodovanikurzu a mail už tedy přichází se správným předmětem. Pokud ale to samé provedu s ostatními proměnnými, které pod vypsaným kódem pomocí zalomení \n sčítám do jednoho těla, které se má odeslat, dorazí všechny ne se špatnou diaktitikou (š, ž a ť), ale tentokrát jsou písmenka úplně pomíchaná a nedávají už vůbec smysl.

Pro jistotu uvedu i pokračování kódu:

if ($kurz!="" and $jmeno!="" and $prijmeni!="" and $ulice!="" and $mesto!="" and $psc!="" and $telefon!="" and $email!="" and $email!="" and $spam=="2")
{
Mail("muj@email.cz", $kurz, $jmeno." \n ".$prijmeni." \n ".$ulice." \n ".$mesto." \n ".$psc." \n ".$telefon." \n ".$vzkaz, "From: " . $email);
echo "<p><strong>Přihláška byla úspěšně odeslána. Co nejdříve se vám ozveme.</strong></p>";
}
else
{
echo "<p><strong>Přihlášku se nepodařilo odeslat, pravděpodobně jste nevyplnili všechny údaje, nebo neodpověděli na antispamovou otázku.</strong></p>";
}

Ať googlím, jak googlím, nic nemůžu najít. Na jiných fórech jsem našel řešení pomocí následujícího kódu:

$headers .= "MIME-Version: 1.0\n".
"Content-Type: text/plain; charset=\"Windows-1250\"\n".
"Content-Transfer-Encoding: base64\n";

a proměnnou definovat takto:

$jakakoliv_promenna = $_POST['prijaty_parametr'];
$kodovani_teto_promenne = base64_encode ($jakakoliv_promenna);

...ale nevím, jak ho použít, protože mi vrací to samé (podle mě je to dokonce i ten samý kód).

Kódování celého webu je Windows-1250.

Také jsem vyčetl, že záleží na poskytovateli mailu, že někde dorazí mail správně. Já to testuju na Seznamu a tam je problém takový, jak jsem ho popsal v dotazu.

Už si fakt nevím rady, tak předem dík všem, kteří se nějak zapojí do řešení tohoto problému.

Předmět Autor Datum
Já používám tuhle funkci (ta je ale s přílohou, to už si odmažeš): function mail_attachment ($from…
marekdrtic 18.04.2009 18:53
marekdrtic
Bejt tebou, použil bych nějaký hotový řešení - třeba já používám PHPMailer - bez problémů - pravda,…
angel333 18.04.2009 18:57
angel333
Tak mezitím jsem to za menší pomoci známého vyřešil. Hlavička se měla uvést hlavně v parametrech ode… poslední
Dave 18.04.2009 19:58
Dave

Já používám tuhle funkci (ta je ale s přílohou, to už si odmažeš):

function mail_attachment ($from , $to, $subject, $message, $attachment){
	$fileatt = $attachment; // Path to the file                  
	$fileatt_type = "application/octet-stream"; // File Type 
    $start=	strrpos($attachment, '/') == -1 ? strrpos($attachment, '//') : strrpos($attachment, '/')+1;
	$fileatt_name = substr($attachment, $start, strlen($attachment)); // Filename that will be used for the file as the 	attachment 

	$email_from = $from; // Who the email is from 
	$email_subject =  $subject; // The Subject of the email 
	$email_txt = $message; // Message that the email has in it 
	
	$email_to = $to; // Who the email is to

	$headers = "From: ".$email_from;

	$file = fopen($fileatt,'rb'); 
	$data = fread($file,filesize($fileatt)); 
	fclose($file); 
	$msg_txt="";

	$semi_rand = md5(time()); 
	$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 
    
	$headers .= "\nMIME-Version: 1.0\n" . 
            "Content-Type: multipart/mixed;\n" . 
            " boundary=\"{$mime_boundary}\""; 

	$email_txt .= $msg_txt;
	
	$email_message .= "This is a multi-part message in MIME format.\n\n" . 
                "--{$mime_boundary}\n" . 
                "Content-Type:text/html; charset=\"utf-8\"\n" . 
               "Content-Transfer-Encoding: 7bit\n\n" . 
	$email_txt . "\n\n"; 

	$data = chunk_split(base64_encode($data)); 

	$email_message .= "--{$mime_boundary}\n" . 
                  "Content-Type: {$fileatt_type};\n" . 
                  " name=\"{$fileatt_name}\"\n" . 
                  //"Content-Disposition: attachment;\n" . 
                  //" filename=\"{$fileatt_name}\"\n" . 
                  "Content-Transfer-Encoding: base64\n\n" . 
                 $data . "\n\n" . 
                  "--{$mime_boundary}--\n"; 


	$ok = @mail($email_to, $email_subject, $email_message, $headers); 

	if($ok) { 
	} else { 
		die("Sorry but the email could not be sent. Please go back and try again!"); 
	} 
}

Změň si v tom kodování na windows-1250 a snad ti to bude fungovat ;-)

Tak mezitím jsem to za menší pomoci známého vyřešil. Hlavička se měla uvést hlavně v parametrech odesílaného e-mailu, tzn. za proměnnými, které se mají odeslat. Nebudu se tu o tom rozepisovat a přikládám řešení v zipu. Dopsal jsem tam ještě, aby na mail nedocházely jenom hodnoty zadané uživatelem, ale i názvy hodnot, které se zadávaly, tzn. Jméno: Dave, Příjmení: atd...

Neříkám, že je toto řešení ideální, ani ho nikomu nevnucuju, ale snad se bude hodit těm, kteří měli potíže ohledně tohoto problému něco vygooglit, tak jako já.

Ale díky oběma nade mnou, kteří se podělili o další řešení, ještě si to pročtu ;-)

Zpět do poradny Odpovědět na původní otázku Nahoru