Autor Zpráva
j_hajsl
Profil
Zdravim,

posílám totožný html mail na centrum.cz a seznam.cz

na účtu Centrum.cz je vše ok, a to jak přes webmail, tak přes pop3 v outlooku
na účtě Seznam.cz dojde ovšem k zásahu do tohoto mailu a to na úrovni zdrojáků ... html tělo mailu se změní na text, v úvodu je vidět zdroják content-type a encoding, jsou vidět html tagy - mail vypadá stejně na webmailu i v outlooku ...

když pošlu textový mail, opět Centrum ok, v seznamu je prázdno (jak webmail, tak outlook), používám

              $mail = new PHPMailer;
              $mail->CharSet = "iso-8859-2";
              $mail->ContentType 	= "text/plain";
              $mail->Subject = "=?iso-8859-2?Q?".imap_8bit(iconv("UTF-8","ISO-8859-2","Úspěšná registrace do aplikace"))."?=";
              $mail->body = iconv("UTF-8","ISO-8859-2",$text);


nebo

              $mail = new PHPMailer;
              $mail->CharSet = "iso-8859-2";
              $mail->ContentType 	= "text/html";
              $mail->Subject = "=?iso-8859-2?Q?".imap_8bit(iconv("UTF-8","ISO-8859-2","Úspěšná registrace do aplikace"))."?=";
              $mail->MsgHTML(iconv("UTF-8","ISO-8859-2",$text));



nesetkal jste se s tím někdo a neznáte řešení? nebo musím odesílání mailu vyřešit vlastní knihovnou, porovnáváním zdrojáků mailů generovaných seznamech, centrem či outlookem. Díky za nápovědu.

Moderátor nightfish: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
j_hajsl
Profil
tak si odpovím sám, ale trvalo mi 2 hodiny na to příjit :-) ...

$mail->LE = "\n";

defaultní je totiž "\r\n"; což seznamacký mailer asi bere jako útok od Windows :-)
Kcko
Profil
Neuškodilo by toto dát do FAQ
Alphard
Profil
Kcko:
Neuškodilo by toto dát do FAQ
Právě jsem přidal alespoň odkaz na toto vlákno.
Ve FAQ bylo dlouhou dobu pouze '\n', před několika měsíci došlo s ohledem na specifikaci ke změně na '\r\n', ovšem bez testování :-(. Budu na to muset mrknout.
Kcko
Profil
Alphard:
V pořádku, to bylo jen nebetyčné přání, žádná výtka :-)
Davex
Profil
j_hajsl:
Problém s pomršenou hlavičkou není způsoben koncem řádků. Specifikace RFC 822, MIME specifikace RFC 2045–2049 a RFC 2822 vyžadují v hlavičce i těle e-mailu výhradně kombinaci znaků CRLF ("\r\n") jako konec řádku, takže by bylo minimálně divné, kdyby to nějakému systému mělo vadit (a pokud by to opravdu vadilo, tak je to chyba, která by se měla opravit).

Pokud někde funguje samotný LF, tak se na to nedá vždy spolehnout, protože tato funkčnost není ničím zaručena – v RFC 2822 se o něm píše v části 4.1 toto: „V mnoha případech jsou samotné CR nebo LF nesprávně používány místo CRLF k označení oddělovače řádku.“ Pokud by to někomu nestačilo, tak je to ještě v podobném smyslu zmíněno v RFC 5321 v bodech 2.3.8 a 4.1.1.4.

Teoreticky by mohlo záležet na tom, jakým programem funkce mail() zprávu odešle a na jakém systému PHP běží – některé verze programu /usr/sbin/sendmail mohou hloupě doplňovat CR před všechny LF, a pak by asi bylo vhodné, používat jako konec řádku konstantu PHP_EOL pomocí funkce:
function any2eol($text)
{
  return strtr($text, array("\r\n" => PHP_EOL, "\r" => PHP_EOL, "\n" => PHP_EOL));
}


V tomto případě je ale problém způsoben použitím nevhodné funkce imap_8bit(), která je určena pouze k zakódování těla e-mailu a nelze od ní očekávat něco jiného. Pro zakódování v MIME hlavičce platí ještě další pravidla – kromě dalších požadavků je zakázána nezakódovaná mezera (RFC 2047 bod 2) a řádek nesmí být delší než 76 znaků (delší řádky se musí samostatně zakódovat a části jsou na nových řádcích odsazených mezerami nebo tabulátorem). Funkce imap_8bit() tyto požadavky nepokrývá a vyprodukuje tedy výstup, který nelze do hlavičky rovnou použít – vytvořil jsi vadnou hlavičku.

Pokud používáš PHPMailer, tak v něm stačí nastavit správně kódování a žádná další magie není potřeba.

function do_mailu($text)
{
  return iconv('UTF-8', 'ISO-8859-2', $text);
}

$mail = new PHPMailer;

$mail->CharSet = "iso-8859-2";
$mail->Encoding = "quoted-printable";

$mail->Subject = do_mailu("Úspěšná registrace do aplikace");
$mail->Body = do_mailu($text);
j_hajsl
Profil
Davex:
tak jsem zkusil tvůj postup a funguje to dobře, pokud dám mail text/plain, pokud ale zkouším mail v html, tak bohužel je tělo zprávy prázdné jak při použití 8bit tak při použití quoted-printable
Davex
Profil
Odesílání HTML e-mailu mi funguje naprosto spolehlivě (bez nastavení ContentType) pomocí:
$mail->IsHTML(true);
$mail->Body = do_mailu($html);
// případně s textovou alternativou
$mail->AltBody = do_mailu($text);

Co ještě zkusit zakomponovat funkci any2eol()? Třeba takto:
function do_mailu($text)
{
  return any2eol(iconv('UTF-8', 'ISO-8859-2', $text));
}

Podívám se ještě na tu metodu MsgHTML().


Doplněno: Zkoušel jsem všechny možné varianty konců řádků včetně odeslání komplexního HTML - nepodařilo se mi vyvolat žádný náznak problému. Ještě by mohla být chyba v HTML kódu, ale je divné, že se chování po změně ukončení řádku změní.

Můžeš dát k dispozici kompletní zdrojový kód použitý k odeslání včetně HTML kódu a soubor se zprávou uložený z webového rozhraní Seznamu?
j_hajsl
Profil
function forMail($text)
{
	return any2eol(iconv("CP1250","ISO-8859-2",$text));
}

function any2eol($text)
{
  return strtr($text, array("\r\n" => PHP_EOL, "\r" => PHP_EOL, "\n" => PHP_EOL));
}

           $doplnit_vzkaz = "
Můžete nás znovu kontaktovat na telefonním čísle .....
           ";

           $body= "
                    <html>
                    	<head>
                    	<style type=\"text/css\"><!--
                          body {font-size: 12px; color: black; font-family: Arial, serif}
                          .firma {font-weight: bold; color: #32005B}
                          .small {color: #000097}
                          .web_href {text-decoration: underline; color: #00B050; font-weight: bold}
                          .mail_href {text-decoration: underline; color: #32005B; font-weight: bold}
                          .red {color: #00B050; font-weight: bold; font-size: 14px}                        -->
                        </style>
                        </head><body><p>
Vážená paní, vážený pane,<br /><br />
Děkujeme Vám za zájem o služby naší společnosti.<br /><br />
".$doplnit_vzkaz."
<br /><br />
S přátelským pozdravem<br />
Tým Firma<br /><br />
<span class=\"firma\">Firma</span><br />
<span class=\"small\">
Tel: +420 XXX XXX XXX<br />
Fax: +420 XXX XXX XXX<br />
e-mail: <a href=\"mailto: info@firma.cz\" class=\"mail_href\">info@firma.cz</a><br />
<a href=\"http://www.firma.cz\" class=\"web_href\">www.firma.cz</a></br />
</span>                         
</p>
</body>
</html>";
 	

     $body = forMail($body);
     
     $mail = new PHPMailer();
     $mail->From        = "info@firma.cz";
     $mail->FromName    = forMail("Firma.cz s diakritikou");
     $mail->Subject     = forMail("Důležitá informace k produktu Firma s diakritikou");
     $mail->CharSet     = "iso-8859-2";

     $mail->AddAddress($klient["email"],forMail($klient["jmeno"]." ".$klient["prijmeni"]));
     $mail->Body = $body;
     $mail->IsHTML(true);
            
     $odeslano = $mail->Send();
     return $odeslano;


pokud pošlu takto, tak je to OK jak v outlooku, tak na Seznamu, ale pouze při zapnutném zobrazení HTML mailů
pokud to vypnu, tak to nabízí pouze přílohu noname, kde to uloží v pořádku, ale pro BFU je to nepoužitelné, proto jsem zkusil přidat řádek
$mail->AltBody = strip_tags(forMail($body));

ovšem zde se to bohužel kurví opět jako předtím, když změním řádkování na
$mail->LE = "\n";

tak už je to v pořádku už všude
Davex
Profil
Domnívám se, že chyba není ve skriptu ani v e-mailu Seznamu, protože zpráva se mi bez problému zobrazí v obou variantách $mail->LE i s textovou alternativou pomocí
$mail->AltBody = strip_tags($body);
Zobrazení HTML e-mailu na Seznamu pouze ořízne CSS styl z hlavičky, takže text není nastylován. V textovém režimu se zobrazí textová alternativa také bez problému.

Chyba bude pravděpodobně na webserveru při odeslání e-mailu nebo někde jinde na cestě. Zkoušel jsi skript na jiném hostingu?
Alphard
Profil
Včera jsem pracoval s phpMailerem, posílal jsem html maily i na Seznam, a vše fungovalo správně bez nastavení $mail->LE. Chyba musí být pravděpodobně ve vašem hostingu, souhlasím s Davexem.
Jen doplním, že maily posílám v utf-8.

Alphard:
Právě jsem přidal alespoň odkaz na toto vlákno.
Odkaz opět zruším. Tohle je anomálie, nebudeme stašit.
joe
Profil
Také umím posílat HTML e-maily na Seznam bez problémů.
j_hajsl
Profil
tak jsem zkusil spustit absolutně totožný skript na hostingu ignum.cz a tvujweb.cz a stejný výsledek

dál jsem zkoumal a ze zdrojáků jednotlivých zpráv je mi asi jasné v čem je problém, když si otevřu zdroják zprávy ze Seznamu, tak je mezi hlavičkami vždy dvojí zařádkování a to se nejspíše špatně převede, seznam.cz to neumí nepřečíst, resp. to čte příliš striktně a pak v případě vypnutí html zobrazování jako text zobrazí HTML část mailu ...

je to ale divné, protože odesílám stejným skriptem ZÁROVEŇ i na centrum.cz a tam je to v pořádku ...

výsledky mého zkoumání zde, jsou tam neupravené zdrojáky mailů ve všech variantách z obou hostingů a webmailů, ale zdá se, že ze Seznamu.cz se prostě v případě použití \r\n vrací přeformátovaný mail
Davex
Profil
j_hajsl:
Zkoušel jsem to na vlastních serverech, Webzdarma a IC.cz - e-mail se zobrazí správně.

Chyba se mi podařila vyvolat až na ovocném hostingu - e-mail se poškodí při odeslání na serveru, protože všude vstupují do funkce mail() identická data (kromě jiného času, Message-Id a hodnoty boundary). Možná zprávu poškozuje nějaká starší verze programu sendmail z Postfixu (jak píšu v třetím odstavci [#6]) . Verzí PHP to nejspíš nebude, protože na IC je stejná.
j_hajsl
Profil
Davex:
potvrzuji, právě jsem vyzkoušel verzi bez
$mail->LE = "\n"
na webzdarma.cz a vše v pořádku

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0