Odesílání e-mailů
Téměř každá aplikace na webu potřebuje odesílat e-maily, ať už newslettery nebo zapomenutá hesla. Proto Nette Framework poskytuje potřebné nástroje.
Příklad odeslání e-mailu třídou Nette\Mail\Message:
use Nette\Mail\Message;
$mail = new Message;
$mail->setFrom('Franta <franta@example.com>')
->addTo('petr@example.com')
->addTo('jirka@example.com')
->setSubject('Potvrzení objednávky')
->setBody("Dobrý den,\nvaše objednávka byla přijata.")
->send();
Všechny zadávané parametry musí být v UTF-8.
Paráda, to snad ani nepotřebuje hlouběji rozebírat. Tak jen dodáme, že
kromě uvedení příjemce metodou addTo() lze uvést i příjemce
kopie addCc() a jeho slepého druha addBcc(). Ve
všech těchto metodách včetně setFrom() můžeme adresáta
zapsat třemi způsoby:
$mail->setFrom('franta@example.com');
$mail->setFrom('franta@example.com', 'Franta');
$mail->setFrom('Franta <franta@example.com>');
HTML obsah se předává metodou setHtmlBody():
$mail->setHTMLBody('<b>Sample HTML</b> <img src="background.gif">');
Vložené obrázky lze do emailu vkládat metodou
$mail->addEmbeddedFile('background.gif'), nicméně není to
potřeba. Proč? Protože Nette Framework sám vyhledá a vloží všechny
soubory odkazované v HTML kódu. Toto chování lze vypnout uvedením
FALSE jakožto druhého parametru
metody setHtmlBody()
Pokud HTML email nemá textovou alternativu, bude vygenerována automaticky.
A pokud HTML email nemá nastavený subjekt, bude vzat z elementu
<title>.
Do e-mailu lze samozřejmě vkládat i přílohy:
$mail->addAttachment('example.zip');
Může být odesílání e-mailů ještě jednodušší?
Šablony
Skutečná síla se projeví při zkombinování se šablonovacím systémem Latte:
$template = new Nette\Templating\FileTemplate('email.phtml');
$template->registerFilter(new Nette\Latte\Engine);
$template->orderId = 123;
$mail = new Message;
$mail->setFrom('Franta <franta@example.com>')
->addTo('petr@example.com')
->setHtmlBody($template)
->send();
V šabloně bude dostupná lokální proměnná $mail
s objektem zprávy, lze tedy i v šabloně nastavit další parametry
zprávy.
Soubor email.phtml:
{var $mail->from = "Franta <franta@example.com>" }
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Potvrzení objednávky</title>
<style>
body {
background: url("background.png")
}
</style>
</head>
<body>
<p>Dobrý den,</p>
<p>Vaše objednávka číslo {$orderId} byla přijata.</p>
</body>
</html>
Pokud odesíláte e-mail v komponentě nebo presenteru, můžete
vytvořit šablonu příkazem $template =
$this->createTemplate(); a poté budete moci generovat v šabloně
i odkazy. Tvořte je vždy absolutní via {link
//Presenter:action}
Vlastní mailer
Výchozí mailer používá PHP funkci mail. Pokud bychom potřebovali poštu odesílat
skrze SMTP server, použijte SmtpMailer
$mailer = new Nette\Mail\SmtpMailer(array(
'host' => 'smtp.gmail.com',
'username' => 'franta@gmail.com',
'password' => '*****',
'secure' => 'ssl',
));
$mailer->send($mail);
Alternativně můžete SmtpMailer předat přímo instanci Message:
$mail = new Message;
// ... konfigurace zprávy
$mail->setMailer($mailer);
$mail->send();
Můžeme si také vytvořit vlastní mailer, jde o objekt implementující rozhraní Nette\Mail\IMailer.
Komentáře 
kahi | 9. 9. 2011, 17:07 | comment
@Patrik Votoček: Možná by se element style neměl v příkladovém mailu vůbec vyskytovat (když ho většina klientů ignoruje).
jarks | 7. 10. 2011, 16:15 | comment
Při tomto způsobu vytváření šablony:
$template = new Nette\Templating\FileTemplate('email.latte');
nefungují standardní helpery. Napravit se to dá tím, že se místo toho použije:
$template = parent::createTemplate();
$template->setFile('email.latte');
2bfree | 2. 1. 2012, 13:17 | comment
@kahi Nemám to sice vyzkoušené, ale podle tohoto zdroje http://www.campaignmonitor.com/css/ to vypadá že podpora elementy style v hlavičce je podporována docela běžně
iguana007 | 26. 1. 2012, 10:01 | comment
@2bfree – správně by měly být v emailu css styly inline a ne někde v hlavičce, funguje to tak na více poštovních klientech


Patrik Votoček | 20. 6. 2011, 4:32 | comment
Možná by stálo za zmíňku jak funguje: