Autor Zpráva
dan55
Profil
Zdravím,
používám funkci cs_mail() ze zdejšího FAQ a dnes jsem narazil na problém.
Email odesílám takto:
$zprava="Zpráva z katalogu!\nKatalog: ".BASE_URL."\nIP odesílatele: ".$_SERVER["REMOTE_ADDR"]."\nZpráva:\n\n".$text;
if(cs_mail(ADMIN_EMAIL,$predmet,$zprava,"From:".$email."\r\n")){

ADMIN_EMAIL a $text,$predmet a $email jsou definovány.
Mě to dojde na email v pohodě, ale zákazníkovi (používá theBat) to dojde takto (hlavičky a obsah).
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Message-Id: <20110302190128.344A710EF2B@server2.hostingserveru.cz>
Date: Wed,  2 Mar 2011 20:01:28 +0100 (CET)


WnByw6F2YSB6IGthdGFsb2d1IQpLYXRhbG9nOiBodHRwOi8vMTIzc2V6bmFtLmJkci5jei8KSVAgb2Rlc8OtbGF0ZWxlOiA4OS4yMzUuMjIuMjUzClpwcsOhdmE6CgpNw6FtIGRvdGFTIHRlc3Q=

Kde je problém?
Alphard
Profil
Dojde to správně, ale klient by to měl dekódovat, jak mu říká hlavička Content-Transfer-Encoding: base64. S touto chybou jsem se ještě nesetkal.

Zkoušeli jste poslat více mailů? Dělá to soustavně, nebo je to náhodná chyba?
dan55
Profil
Alphard:
Už jsme to dvakrát zkusili, zkusíme to ještě.
Kdyby to byla chyba poštovního klienta, tak existuje ještě jiná ověřená možnost odesílání emailů s českými znaky? Nechci do toho motat php mailer apod...
edit2: tak už nedojde ani aktivační email, chyba je tedy jinde, dám Vám vědět (předtím to šlo na jiném katalogu)
edit3: ale mě to jde, takže nevím kde je chyba
edit4: nepopohl ani restart poštovního klienta, zákazníkovi to dojde zakodované ale mě to dojde nádherně
Alphard
Profil
dan55:
tak existuje ještě jiná ověřená možnost odesílání emailů s českými znaky
Lze použít ještě Quoted-Printable. Viz RFC 2047 4. Encodings. Je třeba změnit hlavičku a ošetřit problémové znaky.
Už jsem párkrát přemýšlel o updatu funkce v FAQ, base64 je možná zastaralé, ale dosud mělo bezproblémovou podporu a měl jsem vyzkoušeno. Překvapuje mě, že zrovna The Bat dělá problémy...

Zkuste ještě smazat tu hlavičku From.
dan55
Profil
Alphard:
No tak prý je problém na straně serveru, už se to řeší ale vím, že ještě email odeslaný stejnou funkcí před pár dny šel. Takže theBat za to ASI nemůže
DoubleThink
Profil *
dan55:
Nechci do toho motat php mailer apod...
Proč? PHPmailer je spolehlivá a jednoduchá cesta, jak v PHP sestavit bezchybně mail.
Na koleně zbastlený mail má kromě toho často tendenci padat do spamu.
dan55
Profil
DoubleThink:
Nemám s tím zkušenosti a jednodušší mi přijde použít tu cs_mail, nikdy mi žádný email neskončil ve spamu ani nikomu z řad zákazníků apod, takže nemám důvod to používat...
dan55
Profil
Už je to ok, museli jsme místo /r/n použít /n...
cerkoxxl
Profil
Dan55, Ďakujem ti za toto riešenie. Už pol roka sa znažím vyriešiž tiež tento problém, ale ani vo sne by ma nebolo napadlo, že riešenie je takéto ľahké. Som začiatočník v PHP a už som môj kód prekopal asi 100 krát a stáleto to bolo o tom istom. Na niektoré emalové účto proste priľla správa zakódovaná a na niektoré nie. Odstránenie <b>/r</b> moje problémy vyriešilo. Ďakujem ti.
Alphard
Profil
cerkoxxl:
Původně tam bylo jen \n, pak jsme to přepsali na \r\n a nakonec jsme modifikovali na PHP_EOL. Tak můžete vyzkoušet současnou verzi, která by měla být nezávislá na serveru.
Nox
Profil
Alphard:
Proč platformně? Myslel jsem, že hlavičky mailů jsou právě nezávislé a specificky je tam \r\n

http://tools.ietf.org/html/rfc5322#section-2.2 RFC píše oddělení CRLF (\r\n pro ty kdo neznají)
("Header fields are lines beginning with a field name, followed by a colon (":"), followed by a field body, and terminated by CRLF")
stejně tak http://tools.ietf.org/html/rfc2045#section-2.10 a dalších odkazovaných
Alphard
Profil
Nox:
Abych pravdu řekl, dát tam PHP_EOL navrhl Davex, věřím mu. Tu normu jsem četl (výběrově), jenže jak píše dan55 a teď i cerkoxxl, sekvence \r\n právě nefungovala. Jde jim to až po odstranění \r a ponechání \n.
Ten script jsem před pěti lety sestavoval já, a dal jsem tam jen \n, s tím myslím problémy nebyly, ale někdo navrhoval dát tam dle normy \r\n, jestli si dobře vzpomínám, tak to byl také Davex.
U současného stavu se nikdo neozval, že by mu to nefungovalo. Mně to šlo když jsem to testoval na Windows, ale jinak již delší dobu používám Nette\Mail\Message, takže vlastními zkušenostmi nemohu sloužit.
Nette sice používá \r\n a s problémy jsem se nesetkal, ale tam se to zase myslím nekóduje base64.
Davex
Profil
Nox:
Myslel jsem, že hlavičky mailů jsou právě nezávislé a specificky je tam \r\n
Změnu na \r\n jsem opravdu doporučil já, protože jsem si to původně také myslel, ale byla to chyba.

Na protokolu SMTP někdy až tolik nezáleží, protože v Linuxu může mezi PHP a poštmistrem (komunikujícím s ostatními pomocí SMTP) číhat ještě hloupý pošťák, který před předáním e-mailu poštmitrovi doplní \r před všechna \n a tak vzniknou problematické sekvence \r\r\n. Pokud si dobře pamatuji, tak se to stávalo u programu sendmail od starších verzí e-mailových serverů Postfix a Exim. E-mailový server Sendmail s tím myslím problémy neměl (shoda jmen Sendmail a sendmail není čistě náhodná - ostatní e-mailové servery se snaží být kompatibilní se Sendmailem, takže některé programy pojmenovávají stejně).

Ve Windows by naopak mohly být problémy se samotným znakem \n, protože tam PHP e-mail odesílá přímo pomocí SMTP.

Jako univerzální řešení se tedy jeví používání konstanty PHP_EOL. Jen doufám, že to nikdo nebude zkoušet na Mac OS X, a že Apple to FreeBSD nepřiohnul trochu víc a ponechal tam Unixové konce řádků.

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:

0