You are browsing the unmaintained documentation for old Nette 2.3. See documentation for current Nette.

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:

$latte = new Latte\Engine;
$params = array(
    'orderId' => 123,
);

$mail = new Message;
$mail->setFrom('Franta <franta@example.com>')
    ->addTo('petr@example.com')
    ->setHtmlBody($latte->renderToString('email.latte', $params));

Soubor email.latte:

<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>

Tvorba odkazů

Samotné šablony nepodporují makro {link}. Pokud ho chceme používat, můžeme si šablonu nechat vytvořit v presenteru nebo komponentě příkazem $template = $this->createTemplate()->setFile('email.latte') a tu předat do setHtmlBody(). Poté budeme v šabloně moci generovat odkazy.

use Nette;

class MyPresenter
{
    public function actionFoo()
    {
        $template = $this->createTemplate()->setFile('email.latte');
        $mail = new Message();
        $mail->setHtmlBody($template);
    }
}

Druhou možností je makro do šablony zaregistrovat ručně. Protože k vytváření odkazů je potřeba presenter, musíme ho předat jako parametr šabloně.

use Nette;
use Nette\Bridges\ApplicationLatte\UIMacros;

function createMessage(Nette\Application\Application $application)

    /** @var Nette\Application\IPresenter */
    $presenter = $application->getPresenter();

    $latte = new Latte\Engine;
    $params = array(
        'orderId' => 123,
        '_presenter' => $presenter, // kvůli makru {plink}
        '_control' => $presenter    // kvůli makru {link}
    );

    UIMacros::install($latte->getCompiler()); // Kromě jiných zaregistruje makro link a plink

    // ...
}

V šabloně pak odkaz vytvoříme pomocí makra {link} tak, jak jsme zvyklí. Použijeme absolutní adresu, aby odkaz vždy směřoval na správnou doménu:

<a href="{link //Presenter:action}">Odkaz</a>

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.