Odesílání mailů z PHP

Odesílání mailů z PHP
« kdy: 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.
« Poslední změna: 10. 06. 2014, 12:38:05 od Petr Krčmář »


Dzavy

Re:Odesílání mailů z PHP
« Odpověď #1 kdy: 10. 06. 2014, 13:27:55 »
PHPMailer

v2kt0r

Re:Odesílání mailů z PHP
« Odpověď #2 kdy: 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.

3ugeene

Re:Odesílání mailů z PHP
« Odpověď #3 kdy: 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

DK

Re:Odesílání mailů z PHP
« Odpověď #4 kdy: 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


Re:Odesílání mailů z PHP
« Odpověď #5 kdy: 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.
Děkuji za možnost editace příspěvku.

Mira

Re:Odesílání mailů z PHP
« Odpověď #6 kdy: 10. 06. 2014, 16:32:58 »
Dej do hlavicky tohle:
 "Content-Transfer-Encoding: base64\n";

Taky jsem musel prepisovat jeden skript kvuli centrumu...


Re:Odesílání mailů z PHP
« Odpověď #7 kdy: 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  ???

Dzavy

Re:Odesílání mailů z PHP
« Odpověď #8 kdy: 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 :)

Hmmm

Re:Odesílání mailů z PHP
« Odpověď #9 kdy: 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 ;)

JmJ

  • ****
  • 324
    • Zobrazit profil
Re:Odesílání mailů z PHP
« Odpověď #10 kdy: 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 :-)

Hmmm

Re:Odesílání mailů z PHP
« Odpověď #11 kdy: 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.

Re:Odesílání mailů z PHP
« Odpověď #12 kdy: 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 :-)