Sending E-mails
Almost every web application needs to send e-mails, whether newsletters or forgotten passwords. That's why Nette Framework provides necessary tools.
Example of sending an e-mail using Nette\Mail\Message class:
use Nette\Mail\Message;
$mail = new Message;
$mail->setFrom('John <john@example.com>')
->addTo('peter@example.com')
->addTo('jack@example.com')
->setSubject('Order Confirmation')
->setBody("Hello, Your order has been accepted.")
->send();
All parameters must be encoded in UTF-8.
In addition to specifying recipient with addTo(), it's possible
to specify recipient of copy with addCc() and recipient of blind
copy: addBcc(). In all these methods, including
setFrom(), we can specifiy addressee in three ways:
$mail->setFrom('john.doe@example.com');
$mail->setFrom('john.doe@example.com', 'John Doe');
$mail->setFrom('John Doe <john.doe@example.com>');
HTML content can be defined using setHtmlBody() method:
$mail->setHTMLBody('<b>Sample HTML</b> <img src="background.gif">');
Embedded images can be inserted using
$mail->addEmbeddedFile('background.gif'), but it is not
necessary. Why? Because Nette Framework finds and inserts all files referenced
in the HTML code automatically. This behavior can be supressed by adding
FALSE as a second parameter of the setHtmlBody()
method.
If a HTML e-mail has no plain-text alternative, it will be automatically
generated. And if it has no subject set, it will be taken from the
<title> element.
Of course, it's possible to add attachments to the e-mail:
$mail->addAttachment('example.zip');
Can e-mail sending be even easier?
Templates
The real power comes in combination with Latte templating system:
$template = new Nette\Templating\FileTemplate('email.latte');
$template->registerFilter(new Nette\Latte\Engine);
$template->orderId = 123;
$mail = new Message;
$mail->setFrom('John <john@example.com>')
->addTo('jack@example.com')
->setHtmlBody($template)
->send();
A local variable $mail containing the Message
object will be available in the template, so it's possible to set message
parameters directly in the template.
File email.latte:
{var $mail->from = "John <john@example.com>" }
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Order Confirmation</title>
<style>
body {
background: url("background.png")
}
</style>
</head>
<body>
<p>Hello,</p>
<p>Your order number {$orderId} has been accepted.</p>
</body>
</html>
If you are sending e-mail in a Component or Presenter, you can
create the template with $template = $this->createTemplate();
and you will be able to also generate links in the template. Always make them
absolute, via {link //Presenter:action}
Custom mailer
Default mailer uses PHP function mail. If you need to send mail through a SMTP
server, you can use SmtpMailer.
$mailer = new Nette\Mail\SmtpMailer(array(
'host' => 'smtp.gmail.com',
'username' => 'john@gmail.com',
'password' => '*****',
'secure' => 'ssl',
));
$mailer->send($mail);
Alternatively, you can pass the mailer directly to the Message
instance:
$mail = new Message;
// message configuration...
$mail->setMailer($mailer);
$mail->send();
You can also create your own mailer – it's a class implementing Nette\Mail\IMailer interface.

