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 |
#2 · Zasláno: 19. 8. 2010, 08:13:08
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 |
#3 · Zasláno: 19. 8. 2010, 08:40:58 · Upravil/a: Kcko
Neuškodilo by toto dát do FAQ
|
||
Alphard Profil |
#4 · Zasláno: 19. 8. 2010, 10:32:46
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 |
#5 · Zasláno: 19. 8. 2010, 11:00:57
Alphard:
V pořádku, to bylo jen nebetyčné přání, žádná výtka :-) |
||
Časová prodleva: 3 dny
|
|||
Davex Profil |
#6 · Zasláno: 22. 8. 2010, 19:17:07
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 |
#7 · Zasláno: 22. 8. 2010, 20:06:38
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 |
#8 · Zasláno: 22. 8. 2010, 20:24:51 · Upravil/a: Davex
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? |
||
Časová prodleva: 3 dny
|
|||
j_hajsl Profil |
#9 · Zasláno: 26. 8. 2010, 07:04:44 · Upravil/a: j_hajsl
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 |
#10 · Zasláno: 26. 8. 2010, 23:17:20
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); 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 |
#11 · Zasláno: 26. 8. 2010, 23:26:04 · Upravil/a: Alphard
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 |
#12 · Zasláno: 26. 8. 2010, 23:34:16
Také umím posílat HTML e-maily na Seznam bez problémů.
|
||
j_hajsl Profil |
#13 · Zasláno: 27. 8. 2010, 07:25:29 · Upravil/a: j_hajsl
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 |
#14 · Zasláno: 27. 8. 2010, 20:15:48
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 |
#15 · Zasláno: 27. 8. 2010, 21:11:16
Davex:
potvrzuji, právě jsem vyzkoušel verzi bez $mail->LE = "\n" |
||
Časová prodleva: 14 let
|
0