Odesílání e-mailů
Téměř každá aplikace na webu potřebuje odesílat e-maily, ať už newslettery nebo potvrzení objednávky. Proto Nette Framework poskytuje potřebné nástroje. Naučime se:
- jak e-mail vytvořit
- jak ho odeslat
- jak přidat přílohy
- jak v e-mailu použít šablony
- jak vytvářet odkazy
Příklad vytvoření 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.");
Všechny zadávané parametry musí být v UTF-8.
A odeslání:
use Nette\Mail\SendmailMailer;
$mailer = new SendmailMailer;
$mailer->send($mail);
V presenterech a službách nevytvářime mailer ručně, ale pomocí DI si necháme předat Nette\Mail\IMailer.
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()
, nebo příjemce skryté kopie 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 (pouze relativní
cesty). Toto chování lze vypnout uvedením FALSE
jakožto druhého parametru metody setHtmlBody()
,
v tomto parametru je též možno předat absolutní cestu ke složce s obrázky.
Pokud HTML email nemá textovou alternativu, bude vygenerována automaticky. A pokud HTML email nemá nastavený subjekt, bude
vzat z elementu <title>
.
Pokud chcete nastavit returnPath a server vám ho pořád přepisuje. Pomůže vám v tom
$commandArgs
.
$mailer->commandArgs = '-fMuj@email.cz';
Nikdy neposílejte e-mailem hesla ani jiné přístupové údaje.
Přílohy
Do e-mailu lze samozřejmě vkládat i přílohy. Slouží k tomu metoda addAttachment:
// vloží do e-mailu soubor example.zip
$mail->addAttachment('path/to/example.zip');
// vloží do e-mailu soubor example.txt s textem "Hello John!"
$mail->addAttachment('example.txt', 'Hello John!');
// vloží do e-mailu soubor example.zip pojmenovaný info.zip
$mail->addAttachment('info.zip', file_get_contents('path/to/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.latte');
$template->registerFilter(new Nette\Latte\Engine);
$template->registerHelperLoader('Nette\Templating\Helpers::loader');
$template->orderId = 123;
$mail = new Message;
$mail->setFrom('Franta <franta@example.com>')
->addTo('petr@example.com')
->setHtmlBody($template);
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.latte
:
{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}
Odesílání přes SMTP
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);
Můžeme si také vytvořit vlastní mailer, jde o objekt implementující rozhraní Nette\Mail\IMailer.