[2009–06–15|25ac85f] Nette\Mail – odesílání emailů
- David Grudl
- Nette Core | 8250
Nette Framework má novou třídu pro odesílání emailů
Nette\Mail\Mail
.
Příklad použití:
Můžete využít i fluent interface:
Do emailu lze vkládat přílohy:
Je také možné odesílat HTML emaily:
Vložené obrázky lze do emailu vkládat metodou
$mail->addEmbeddedFile('background.gif')
, nicméně není to
potřeba. Nette automaticky vyhledá a vloží všechny soubory odkazované
v HTML kódu. Toto chování lze vypnout uvedením FALSE jako druhého
parameteru metody setHtmlBody()
.
Pokud HTML email nemá textovou alternativu, bude vygenerována automaticky.
Pokud HTML email nemá nastavený subjekt, bude vzat z elementu
<title>
.
Třídu Mail lze dobře kombinovat se šablonama:
Do šablony bude automaticky vložená proměnná $mail
, je tedy
možné přímo v šabloně nastavit další hlavičky emailu.
Samotné odesílání emailů obstarává mailer, tím výchozím je SendmailMailer používající PHP funkci mail(). SmtpMailer pro odesílání přes SMTP server je v přípravě.
- Honza Marek
- Člen | 1664
vrtak-cz napsal(a):
A jak je to s
plink
,link
atd. makrama vCurlyBracketsFilter
-u ???
Když šablonu vyrobíš v prezenteru pomocí $this->createTemplate(), tak o tyhle věci nemusíš mít starost.
- Honza Marek
- Člen | 1664
cuga napsal(a):
bude mail pridan i do 0.8 verze, nebo mam pro posilani misto stable verze pouzivat devel verzi???
Jinak samozrejme diky za mail, ten chybel :)
Bude stačit, pokud si zkopíruješ složku Mail z development verze do té stable.
- xzajic
- Člen | 19
Já bych měl prosbu. Pochopil jsem pohledem do zdrojáku, že Nette\Mail je až od verze 0.9. Nedalo by se to (tučně, výrazně, červeně, pro blbce) uvést do Průvodce programátora (https://doc.nette.org/cs/mail) Kdž si jako nováček stáhnu doporučenou verzi (0.8) a vyzkouším si odeslání e-mailu, tak to nebude fungovat ;-)
- Tomik
- Nette Evangelist | 485
xzajic napsal(a):
Já bych měl prosbu. Pochopil jsem pohledem do zdrojáku, že Nette\Mail je až od verze 0.9. Nedalo by se to (tučně, výrazně, červeně, pro blbce) uvést do Průvodce programátora (https://doc.nette.org/cs/mail) Kdž si jako nováček stáhnu doporučenou verzi (0.8) a vyzkouším si odeslání e-mailu, tak to nebude fungovat ;-)
Je to tam, jen otázka, zda to dát jako tip nebo upozornění, zatím jsem to dal jako upozornění, páč je to docela důležitá informace… Ale zase to vypadá, jak nějaká chyba. :)
- Roman Pištěk
- Člen | 10
Nette\Mail\Mail.php, řádek 423: V reguláru asi chybí ungreedy
modifikátor (bez něj je v $matches vše až po poslední uvozovku v <img
/>).
Jinak dobrá práce!
- Jakub Šulák
- Člen | 222
Hlásím „asi bug“:
Subject se nastavuje automaticky z <title>.
Pokud je však v title {$abc}, tak se asi nevyhodnotí, nebo se každopádně
poruší hlavička mailu.
- LeonardoCA
- Člen | 296
Taky mám menší problém, MS Outlook 2007 po zaslání html mailu zobrazí nejdříve plain text a pak html kód jako plain text. Zkoušel jsem zaslat stejný mail s jednoduchou třídou, kterou jsem si psal v únoru a jediný zásadní rozdíl ve výstupech který jsem našel je, že má třída posílá plain text i po ‚Content-Type: multipart/alternative;‘. To jsem někde vyčetl na netu a tuším, že i google mail formátuje odchozí zprávy podobně.
Moje původní řešení, které MS Outlook přelouská správně vypadá takto:
Nemám teď čas studovat detaily, ale třeba bude někdo vědět víc …
- David Grudl
- Nette Core | 8250
Jakub Šulák napsal(a):
Hlásím „asi bug“:
Subject se nastavuje automaticky z <title>.
Pokud je však v title {$abc}, tak se asi nevyhodnotí, nebo se každopádně poruší hlavička mailu.
Chtělo by to podrobnější report…
- David Grudl
- Nette Core | 8250
LeonardoCA napsal(a):
Taky mám menší problém, MS Outlook 2007 po zaslání html mailu zobrazí nejdříve plain text a pak html kód jako plain text. Zkoušel jsem zaslat stejný mail s jednoduchou třídou, kterou jsem si psal v únoru a jediný zásadní rozdíl ve výstupech který jsem našel je, že má třída posílá plain text i po ‚Content-Type: multipart/alternative;‘. To jsem někde vyčetl na netu a tuším, že i google mail formátuje odchozí zprávy podobně.
Zkus prosím nahradit v souboru Mail.php řádek
$mail->setBody(NULL);
za
$mail->setEncoding(self::ENCODING_8BIT);
a vyzkoušej, jestli to
pomůže.
- PetrP
- Člen | 587
xzajic napsal(a):
generuji templaty pro mail v presenteru a stejně musím registrovat filtry a helpery. Nevím, jestli je to chyba nebo vlastnost, ale bez toho to nejede.
Mužeš si ho vytvářet přes $presenter->createTemplate()
a
budeš tam mít stejné filtry jako v presenteru. (Tedy jestli si přidáváš
filtry správně v templatePrepareFilters a né třeba v startupu). Ještě by
si mohl i (clone) $this->template
(budou tam i parametry které
si do té doby přidal; musíš udělat před renderováním)
- Ondřej Mirtes
- Člen | 1536
Napsal jsem mírně propagační článek Dokonalý kontaktní formulář za 10 minut :)
- Ondřej Mirtes
- Člen | 1536
redhead napsal(a):
hezký návod, jen pár otázek:
- proč setuješ flash message po redirectu? Tam by se kód po volání redirect neměl dostat.
- na co je proměnná $req v sendMail metodě? Není nikde využita.
- Sorry, má to být samozřejmě prohozené.
- Pozůstatek z doby, kdy jsem do šablony házel i všelijaké info o uživateli (user-agent, IP adresa, hostname…).
Oboje jsem opravil.
- Ondřej Mirtes
- Člen | 1536
Dnes jsem to pustil na „ostrou“ e-mailovou adresu a zpráva prý přišla (do Outlook Express) v takovéto podobě:
U mě to při testování bylo v pořádku, netuší někdo, v čem by mohl být problém? Revize je (před nočními updaty) nejnovější, musel jsem tam totiž dávat prefixed verzi.
Editoval LastHunter (18. 9. 2009 15:51)
- kravčo
- Člen | 721
Vyzerá to rovnako ako už hlásený bug
v Nette\Mail (ondrique & Honza M.), skontroluj si, či máš na serveri
naozaj najnovšiu verziu Nette a či Nette/Mail/MailMimePart.php
neobsahuje self::EOL . ' '
prípadne v minified verzii
Nette/loader.php self::EOL.' '
, tiež skús zbehnúť
test, ktorý som tam napísal.
- Ondřej Mirtes
- Člen | 1536
Updatnul jsem revizi Nette, problém ale přetrvává :/ Zkoušel jsem pustit i test, na localhostu i na serveru PASS.
Přišel opět takový mail:
Samotné vytváření e-mailu není nic zvláštního:
A šablona:
Editoval LastHunter (18. 9. 2009 16:32)
- Honza Marek
- Člen | 1664
kravčo: Neměl jsem stejný bug jako ondrique. Nefungovalo mi to ani s nejnovější vývojovou verzí a ten test jsem omylem zkoušel na localhostu, kde jsem měl ještě starší nette, takže jsem ti pak poslal špatný výsledek.
- Ondřej Mirtes
- Člen | 1536
Honza M. napsal(a):
kravčo: Neměl jsem stejný bug jako ondrique. Nefungovalo mi to ani s nejnovější vývojovou verzí a ten test jsem omylem zkoušel na localhostu, kde jsem měl ještě starší nette, takže jsem ti pak poslal špatný výsledek.
Tak máš asi to samé co já. Vyřešils to nějak?
- David Grudl
- Nette Core | 8250
Tyhle chyby se poměrně těžko takhle nadálku řeší, doporučil bych tento postup:
- vytvořte email v Nette a uložte do souboru
- pokuste se tentýž email vytvořit v programu, kde to nefunguje a jeho zdrojový soubor uložte do souboru
- oba soubory porovnejte (porovnávejte i whitespaces)
Do fóra nejlépe dávejte odkazy na stažení vygenerovaných emailů, důležitá je totiž jejich binární podoba.
ad bod 1) pro uložení lze použít tento kód
- Ondřej Mirtes
- Člen | 1536
Oboje je z prefixed verze, na websupport.sk běží rozšíření HTTP.
A jak uložit e-mail do této podoby v Outlook Express fakt netuším. Zkoušeli jsme eml, ale prostě to není tento formát.
- Email z Outlook Express (je tam jiný příjemce a odesílatel)
EDIT: Délka předmětu to u mě také řeší :o)
Editoval LastHunter (18. 9. 2009 18:52)
- Ondřej Mirtes
- Člen | 1536
Cifro napsal(a):
LastHunter napsal(a):
na websupport.sk běží rozšíření HTTP.
Off topic: keď požiadaš oni ťa prehodia na iný stroj kde nie je rozšírenie http a ani eAccelerator. Lenže potom namiesto verzie 5.2.9 bude 5.2.6.
Teď už je to jedno, přidávání N do zdrojáků jsem už absolvoval :) Na požadavek vypnutí HTTP mi odpověděli toto:
zial nie je to technicky mozne vypnut iba pre jednu domenu jedine riesenie je asi ze si premenujete tie nazvy u Vas v kode
Žádný přesun jinam mi nenabídli.
- Patrik Votoček
- Člen | 2221
možná to celé souvisí s tím že Nette nezalomí řádek
s předmětem. A tak překročí u RFC 2047 max.
délku řákdu 75znaků.Blbost Nette na to myslí!!!
Editoval vrtak-cz (18. 9. 2009 20:02)
- Patrik Votoček
- Člen | 2221
Beru zpět to co jsem napsal před chvilkou… Trochu po tom pátrám můžeš prosím zkusit jestli bude fungovat tenhle patch? (Je to jenom pokus!!!)
- kravčo
- Člen | 721
Pri bugu v Nette\Mail fungovalo riešenie v jednom prípade (ondrique). Teraz sa tomu dosť divím, najmä po tom, čo som si prečítal na bugs.python.org: #1974 a #1645148 a na viacerích fórach súvisiacich s knižnicami na posielanie mailov.
Vraj má Thunderbird i Outlook problémy so správami, kde sa dlhé hlavičky zalamujú tabulátorom, pričom medzeru v pohode zvládnu. Hovorí sa síce len o ASCII hlavičkách, no problém s tabulátorom by mohol súvisieť aj s tými kódovanými. Aj preto je mi záhadou, ako to, že riešenie u ondriqua zabralo… možno tiež skrátil predmet…
Prosím vás teda (Honza M. i LastHunter), skúste či tieto problémy
spôsobuje i foldovanie medzerou – v súbore
Nette/Mail/MailMimePart.php nahraďte všetky (štyri) výskyty
"\t
→ `" `.
diff --git a/Nette/Mail/MailMimePart.php b/Nette/Mail/MailMimePart.php
index d677e74..0f94006 100644
--- a/Nette/Mail/MailMimePart.php
+++ b/Nette/Mail/MailMimePart.php
@@ -151,7 +151,7 @@ class MailMimePart extends /*Nette\*/Object
$email = " <$email>";
}
if ($len + strlen($email) + 1 > self::LINE_LENGTH) {
- $s .= self::EOL . "\t";
+ $s .= self::EOL . " ";
$len = 1;
}
$s .= "$email,";
@@ -267,7 +267,7 @@ class MailMimePart extends /*Nette\*/Object
foreach ($this->headers as $name => $value) {
$output .= $name . ': ' . $this->getEncodedHeader($name);
if ($this->parts && $name === 'Content-Type') {
- $output .= ';' . self::EOL . "\tboundary=\"$boundary\"";
+ $output .= ';' . self::EOL . " boundary=\"$boundary\"";
}
$output .= self::EOL;
}
@@ -340,7 +340,7 @@ class MailMimePart extends /*Nette\*/Object
if ($l = strspn($s, $range, $pos)) {
while ($len + $l > self::LINE_LENGTH - 2) { // 2 = length of suffix ?=
$lx = self::LINE_LENGTH - $len - 2;
- $o .= substr($s, $pos, $lx) . '?=' . self::EOL . "\t" . $prefix;
+ $o .= substr($s, $pos, $lx) . '?=' . self::EOL . " " . $prefix;
$pos += $lx;
$l -= $lx;
$len = strlen($prefix) + 1;
@@ -353,7 +353,7 @@ class MailMimePart extends /*Nette\*/Object
$len += 3;
// \xC0 tests UTF-8 character boudnary; 9 is reserved space for 4bytes UTF-8 character
if (($s[$pos] & "\xC0") !== "\x80" && $len > self::LINE_LENGTH - 2 - 9) {
- $o .= '?=' . self::EOL . "\t" . $prefix;
+ $o .= '?=' . self::EOL . " " . $prefix;
$len = strlen($prefix) + 1 + 3;
}
$o .= '=' . strtoupper(bin2hex($s[$pos]));
- Bernard Williams
- Člen | 207
Nazdárek,
nevím, jestli se to někde řešilo (na fóru jsem to nenašel), ale napadla mě jedna věc.
Co změnit chování odesílání e-mailů na vývojovém serveru? Nevím jak je to u ostatních, ale v mém případě na všech vývojových serverech (tím myslím jak localhost, tak i přímo servery určené na vývoj) je zasílání e-mailů nežádoucí – nehledě na to, že na localhostu mi to ani nefunguje.
Proto bych navrhl, aby na vývojovém serveru (DEVELOPMENT) metoda $mail->send(); e-mail neodeslala a ale pouze vytvořil jakousi zprávu (log), informující uživatele, že kdyby se aplikace nacházela na ostrém serveru, tak by došlo k odeslání e-mailu.
Tuto zprávu (log) bych si představoval jako nějakou tabulky (popř. více tabulek podle počtu e-mailů), která by obsahovala základní informace (from, to, subject atd.) a tělo zprávy. Tato tabulka by byla absolutně pozicována (0,0) a překrývala by všechen obsah stránky. Také by obsahovala JS odkaz, který by ji po zkontrolování zneviditelnil.
Zatím to řeším zakomentováním metody $mail->send(); (popř. podmínkou isProduction), ale i tak to musím otestovat na ostrém serveru, abych měl jistotu, že obsah e-mailu odpovídá zadání.
Děkuji
Bernard
- Patrik Votoček
- Člen | 2221
Udělej si vlastní SendmailMailer
který to bude ukládat
právě do logu… A v config.ini
si ho zapni pro
development…
- Roman Ožana
- Člen | 52
Třebas se někomu bude hodit můj EmailWithTemplate class
Editoval Roman Ožana (15. 1. 2010 14:50)
- Ondřej Brejla
- Člen | 746
Zaražte mě pokud se mýlím, ale neumí náhodou Nette\Mail nette šablony již v základu? ;-)
- Roman Ožana
- Člen | 52
To je pravda Mail Template umí, ale pokud vím, tak musíte vždy ručně nastavit cestu k template (viz). Tahle class si soubory automaticky najde, podobně jako Presenter si hledá Template k jednotlivým View.
V podstatě máte tři možnosti, class poslat přímo instanci Template, nebo ji zadat celou cestu k template a nebo stačí prostě poslat název souboru bez phtml a třída si ji najde v adresáři např.
class pak hledá tyhle soubory
- {$appdir}/Module<name>/templates/Mail/<PresenterName>/mujmail.phtml
- {$appdir}/templates/Mail/<PresenterName>.mujmail.phtml
- {$appdir}/templates/Mail/<PresenterName>/mujmail.phtml
Pokud to nějaká nová verze umí podobně, tak si ji prostě budu muset stáhnout :)
Editoval Roman Ožana (15. 1. 2010 23:09)