Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: ggoblin 10. 06. 2014, 12:33:42

Název: Odesílání mailů z PHP
Přispěvatel: ggoblin 10. 06. 2014, 12:33:42
Zdravím,

řeším problém s nesprávným odesíláním (nebo možná přijímáním?) emailů, které posílám ze svého webu. Požadavek je jednoduchý html email s diakritikou a obrázkem v patičce. Potud je všechno v pořádku, ale občas se stane, že email dorazí do cíle, ale neproběhne dekódování z base64, takže adresát dostane naprosto nesrozumitelný blok znaků. Stává se mi to především u adresátů @centrum.cz, ale velmi zřídka i jinde.

Aktuálně se emaily odesílají následujícím způsobem (spolu s odpovídajícíma hlavičkama
Kód: [Vybrat]
      $headers = "From: \"Jméno\" <adresa@example.cz>" . "\r\n" .
        "Reply-To: adresa@example.cz" . "\r\n" .
        "MIME-Version: 1.0" . "\r\n" .
        "Content-type: text/html; charset=UTF-8"."\r\n".
        // "Content-Transfer-Encoding: 8bit\r\n".  (tohle nemá na stav problému vliv, ať je to zakomentované nebo ne)
        "X-Mailer: PHP/" . phpversion();

    mb_language('Neutral');
    mb_internal_encoding("UTF-8");
    mb_http_input("UTF-8");
    mb_http_output("UTF-8"); // celý web je v utf-8, ale jak říkám, problém není v kódování, ale v base64
    return mb_send_mail($addr, $subject, $text, $headers);

Pokud to bude možné, rád bych se vyhnul používání nějakého celého frameworku, jednotlivá knihovna je ok. Alternativně bych viděl řešení v posílání textového A html emailu, nicméně tím bych se stejně nevyhnul problému s dekódováním (afaik).

Určitě se s tím už někdo setkal a určitě to někdo chytrý i vyřešil.

Díky za pomoc.
Název: Re:Odesílání mailů z PHP
Přispěvatel: Dzavy 10. 06. 2014, 13:27:55
PHPMailer
Název: Re:Odesílání mailů z PHP
Přispěvatel: v2kt0r 10. 06. 2014, 14:23:01
Když se podíváš na kompletní zdrojový text přijaté zprávy, stojí tam nějaké Content-Transfer-Encoding? Řekl bych, že když ta použitá funkce obsah opravdu Base64 kóduje, měl by to do těch hlaviček někdo napsat.
Ty to tam evidentně nepíšeš, resp píšeš tam 8bit, což není base64 - mělo by se tam objevit něco jako
Kód: [Vybrat]
Content-transfer-encoding: base64Obvyklejší se však zdá být použití quoted-printable - mimo jiné méně plýtvá daty.
Název: Re:Odesílání mailů z PHP
Přispěvatel: 3ugeene 10. 06. 2014, 15:10:55
taky jsem to nedavno resil, a ac nepomuzu a budu tvrdit opak vuci tvemu pozadavku, skoncil jsem natahnutim celyho Nette, kde jsem pouzil formulare + mailer + sablonu pro zpravu emailu...

PHP je proste prasecina :P
Název: Re:Odesílání mailů z PHP
Přispěvatel: DK 10. 06. 2014, 15:34:49
taky jsem to nedavno resil, a ac nepomuzu a budu tvrdit opak vuci tvemu pozadavku, skoncil jsem natahnutim celyho Nette, kde jsem pouzil formulare + mailer + sablonu pro zpravu emailu...

PHP je proste prasecina :P
lidi jako vy z toho delaji prasecinu
Název: Re:Odesílání mailů z PHP
Přispěvatel: to_je_jedno 10. 06. 2014, 15:55:41
PHP je proste prasecina :P
ale guvno, to jen amateri z toho delaji prasecinu kdyz to takhle šudlaj bez nejakyho frameworku.
Název: Re:Odesílání mailů z PHP
Přispěvatel: Mira 10. 06. 2014, 16:32:58
Dej do hlavicky tohle:
 "Content-Transfer-Encoding: base64\n";

Taky jsem musel prepisovat jeden skript kvuli centrumu...

Název: Re:Odesílání mailů z PHP
Přispěvatel: ggoblin 11. 06. 2014, 10:56:00
PHPMailer

To je v tuhle chvíli favorit - akorát mi vadí, že nerozumím tomu, co a proč se děje. Můžu sice použít nástroj, který to vyřeší (a nakonec k tomu budu donucený), ale taky bych rád věděl, proč to a to funguje takhle.

Když se podíváš na kompletní zdrojový text přijaté zprávy, stojí tam nějaké Content-Transfer-Encoding? Řekl bych, že když ta použitá funkce obsah opravdu Base64 kóduje, měl by to do těch hlaviček někdo napsat.
Ty to tam evidentně nepíšeš, resp píšeš tam 8bit, což není base64 - mělo by se tam objevit něco jako
Kód: [Vybrat]
Content-transfer-encoding: base64Obvyklejší se však zdá být použití quoted-printable - mimo jiné méně plýtvá daty.

To je právě to, co mi není jasné, jestli celý svět přijal jiný standard nebo centrum je zaseknuté na zpátečce.

Dej do hlavicky tohle:
 "Content-Transfer-Encoding: base64\n";

Taky jsem musel prepisovat jeden skript kvuli centrumu...



Tohle zkusím jako první, blbé je, že se to má jako s důkazem o existenci boha - dokud neuvidím první špatný email, můžu tvrdit, že je to možná spravené...jistotu ale nemám  ???
Název: Re:Odesílání mailů z PHP
Přispěvatel: Dzavy 11. 06. 2014, 11:09:16
PHPMailer proste funguje a snadno se pouziva. Jeho zdrojak neni komplikovanej, tak se muzes podivat, jak to dela.
Umi prilohy, podepisovat, sifrovat (http://dzavy.net/php/phpmailer-5-1-a-sifrovany-e-mail) a dalsi bezva veci. Nedovedu si uz dneska predstavit, ze bych skladal mail rucne. Pak je z toho PHP opravdu prasecina :)
Název: Re:Odesílání mailů z PHP
Přispěvatel: Hmmm 11. 06. 2014, 11:29:23
taky jsem to nedavno resil, a ac nepomuzu a budu tvrdit opak vuci tvemu pozadavku, skoncil jsem natahnutim celyho Nette, kde jsem pouzil formulare + mailer + sablonu pro zpravu emailu...

PHP je proste prasecina :P
Nie PHP je prasacina, ale to co si urobil ty je prasacina ;)
Název: Re:Odesílání mailů z PHP
Přispěvatel: JmJ 11. 06. 2014, 11:43:13
Nevim, co tady resite. Jestlize koduju cast emailu do base64 a nenapisu to do hlavicky prislusne casti, pak se nemuzu divit, ze to nefunguje. To ze to nekde funguje, je jen dobra vule tvurcu daneho mailoveho klienta, ktery se snazi rozpoznat format, i kdyz udaje o formatu jsou zmatene.

Nez bych dopsal do hlavicky par radku, radeji si na to vezmu dalsi knihvnu nebo cely framework. Nedivim se, ze najit dnes normalniho programatora je problem :-)
Název: Re:Odesílání mailů z PHP
Přispěvatel: Hmmm 11. 06. 2014, 12:13:55
PHP je proste prasecina :P
ale guvno, to jen amateri z toho delaji prasecinu kdyz to takhle šudlaj bez nejakyho frameworku.
Tak s tymto rozhodne nesuhlasim. Pouzitie frameworku nie je nutnost pre vytvorenie pekneho, cisteho PHP kodu. Ale na druhu stranu aj pouzitie frameworkov na kazdu hlupost, ktora sa da elegantne urobit bez frameworku, je prasacina.
Název: Re:Odesílání mailů z PHP
Přispěvatel: ggoblin 11. 06. 2014, 15:00:12
Nevim, co tady resite. Jestlize koduju cast emailu do base64 a nenapisu to do hlavicky prislusne casti, pak se nemuzu divit, ze to nefunguje. To ze to nekde funguje, je jen dobra vule tvurcu daneho mailoveho klienta, ktery se snazi rozpoznat format, i kdyz udaje o formatu jsou zmatene.

Nez bych dopsal do hlavicky par radku, radeji si na to vezmu dalsi knihvnu nebo cely framework. Nedivim se, ze najit dnes normalniho programatora je problem :-)

To je samozřejmě pravda, ale je zase druhá strana věci, kde mi prostě lidsky nedošlo, že to chudák ta funkce musí nějak zakódovat a nemůže to poslat v plaintextu...a do hlavičky si to nedoplní. Doplnit řádek je samozřejmě nejčistší řešení, framework právě kvůli jedné drobnosti nechci nahrávat, už takhle ten web jede pomaleji, než bych rád... Přece nebudu kvůli jedné dvouminutové záležitosti rozebírat celý traktor :-)