Autor Zpráva
marty013
Profil *
Ahoj mám menší problém s emailový formulářem, konkrétně s outputem outlook-u. Myslím, že níže uvedený kód vám při řešení pomůže víc než sáhodlouhé vysvětlování.

Kód pro zpracování formuláře. (WINDOWS-1250, protože outlook má s UTF-8 údajně problém.)
<?
function CHARconverter($txt) {
	if(preg_match('#[\x80-\x{1FF}\x{2000}-\x{3FFF}]#u', $txt)) { // určuje UTF-8
		return iconv("UTF-8", "WINDOWS-1250", $txt); //konvertuje UTF-8 na WINDOWS-1250
    }
	elseif(preg_match('#[\x7F-\x9F\xBC]#', $txt)) { // určuje WINDOWS-1250
		return $txt;
    }
	else { // odvozuje ISO-8859-2
		return iconv("ISO-8859-2", "WINDOWS-1250", $txt); //konvertuje ISO-8859-2 na WINDOWS-1250
    }
}

function rezervovat($to, $subject, $message, $head = "") {
	$head .= "MIME-Version: 1.0\r\n";
	$head .= "Content-Type: text/plain; charset=\"windows-1250\"\r\n";
	$head .= "Content-Transfer-Encoding: base64\r\n";
	$subject = "=?windows-1250?B?" . base64_encode(CHARconverter($subject)) . "?=";
	$message = base64_encode(CHARconverter($message));
	return mail($to, $subject, $message, $head);
}

$zprava =	"REZERVACE\n" .
			"Od: " . $_POST['odden'] . $_POST['odmesic'] . " " . $_POST['odrok'] . " Do: " . $_POST['doden'] . $_POST['domesic'] . " " . $_POST['dorok'] . "\n" .
			"Počet dospělých: " . $_POST['dospeli'] . "\n" .
			"Počet dětí: " . $_POST['deti'] . "\n" .
			"Domácí zvíře: " . $_POST['zvire'] . "\n" .
			"Jméno: " . $_POST['jmeno'] . "\n" .
			"Tel. č.: " . $_POST['telefon'] . "\n" .
			"E-mail: " . $_POST['email'] . "\n" .
			"\n" .
			"ZPRÁVA ZÁKAZNÍKA\n" .
			$_POST['text'];
			
$predmet = "Rezervace Penzion Komtesa - " . $_POST['jmeno'];

if (rezervovat("vondrak@marill-studio.cz", $predmet, $zprava, "From: =?WINDOWS-1250?B?" . base64_encode(CHARconverter($_POST['jmeno'])) . "?=<" . base64_encode(CHARconverter($_POST['email'])) . "> /r/n")) {
	echo "MAIL SENT";
} else {
	echo "!MAIL SENT";
}
?>


Output Outlook-u (Předmět atp se zobrazují správně.)
Content-Type: text/plain; charset="windows-1250" 
Content-Transfer-Encoding: base64 


UkVaRVJWQUNFCk9kOiAxNi5saXN0b3BhZHUgMjAxMCBEbzogMTgubGlzdG9wYWR1IDIwMTAKUG/oZXQgZG9zcOxs/WNoOiAyClBv6GV0IGTsdO06IDAKRG9t4WPtIHp27fhlOiBOZQpKbelubzogTWFydGluIFZvbmRy4WsKVGVsLiDoLjogKzQyMCA3NzY2OTQwMTMKRS1tYWlsOiBtYXJ0aW52b25kcmFrQGNlbnRydW0uY3oKClpQUsFWQSBawUtBWk7NS0EK7Jro+J794e3p+vk=


Originál internet hlavička z Outlook-u
Return-Path: <web.cz@smtpsmart.forpsi.com>
Delivered-To: ja@web.cz
Received: (qmail 11449 invoked by uid 89); 21 Oct 2010 18:04:11 -0000
Received: by simscan 1.3.1 ppid: 11428, pid: 11430, t: 0.3416s
         scanners: clamav: 0.95.1/m: spam: 3.2.5
X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on mxavas3.forpsi.com
X-Spam-Level: 
X-Spam-Status: No, score=-100.6 required=5.0 tests=BASE64_LENGTH_79_INF,
	BAYES_00,MIME_BASE64_BLANKS,MIME_BASE64_TEXT,RDNS_NONE,USER_IN_WHITELIST
	autolearn=disabled version=3.2.5
Received: from unknown (HELO smtpsmart.forpsi.com) (81.2.194.54)
  by mxavas3.forpsi.com with SMTP; 21 Oct 2010 18:04:11 -0000
Received: (qmail 18337 invoked by uid 89); 21 Oct 2010 18:04:11 -0000
Received: by simscan 1.4.0 ppid: 18333, pid: 18335, t: 0.0100s
         scanners: clamav: 0.95.1/m:49/d:8550
Received: from unknown (HELO d176ud.forpsi.com) (10.2.195.176)
  by smtpsmart-2.forpsi.com with SMTP; 21 Oct 2010 18:04:11 -0000
Received: (qmail 24963 invoked by uid 1904); 21 Oct 2010 18:04:08 -0000
Date: 21 Oct 2010 18:04:08 -0000
Message-ID: <20101021180408.24962.qmail@d176u.forpsi.com>
From: odesilatel@server.com
To: ja@web.cz
Subject: =?windows-1250?B?UmV6ZXJ2YWNlIFBlbnppb24gS29tdGVzYSAtIE1hcnRpbiBWb25kcuFr?=
MIME-Version: 1.0


Je tedy celkem jasné, že z hlavičky se vytratilo pár důležitých informací (Content-Type: text/plain; charset="windows-1250" a Content-Transfer-Encoding: base64). Nevíte někdo jak je tam outlooku vecpat? Zkoušel jsem Thunderbird a tam to jelo v pohodě takže jsem celkem bezradnej a děkuju za jakoukoli pomoc.
Davex
Profil
Hlavní problém by mohl být ve volání funkce rezervovat(), kde je chyba na konci v /r/n - správně tam patří zpětná lomítka \r\n.

Další problém může být v kombinování různých typů konců řádků \r\n v hlavičce a \n v těle e-mailu. E-mail se tam odesílá přes Qmail, takže zkus všude jako konec řádku použít jen \n.
marty013
Profil *
Děkuju zkusím, ale zřejmě až zítra, protože v prohlížeči sice končím při testu s "MAIL SENT" ale ve schránce nějak nic. Jinak ty lomítka mi uletěly to je jasný, ale ty dva způsoby ukončování jsem právě viděl tady na fóru ve FAQ. Tak uvidíme, jak to dopadne.
Davex
Profil
V tomto případě bude vadit jen ukončení řádku v hlavičce, protože v těle e-mailu se konce řádků zákodují do base64. Omlouvám se za nepřesnost.
marty013
Profil *
Tak jsem to ještě zkusil a paráda dík moc, jen by asi bylo vhodný překopat to FAQ, protože já bych v životě na ten dvojí způsob sám nepřišel a díky tomu mi to vlastně nejelo. (Doufám, že to nevypadá, že dělám chytrýho, ale myslim to dobře. Já u toho kvůli outlooku strávil tak 10h čistýho času.)
Davex
Profil
Původně bylo ve FAQ jen \n a změnu na \r\n, kterou jsem (ovlivněn DoubleThinkem) inicioval já, asi budeme muset přehodnotit, protože s tím lidé mají problémy. Nesouvisí to přímo s PHP, ale je to způsobeno různými SMTP démony na linuxových serverech a se způsobem zpracování e-mailu. Různé varianty ukončení řádku nevadí Eximu, Sendmailu a novým verzím Postfixu. Vadí Qmailu a starším verzím Postfixu.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: