Sending E-mails
Almost every web application needs to send e-mails, whether it's newsletter or order confirmation. That's why Nette Framework provides necessary tools. This tutorial will show you how to:
- create e-mail
- send it
- add attachments
- use templates in e-mails
- create links
Never send passwords or any other login credentials by e-mail.
Example of creating 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.");
All parameters must be encoded in UTF-8.
And sending:
use Nette\Mail\SendmailMailer;
$mailer = new SendmailMailer;
$mailer->send($mail);
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 specify 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.
Attachments
Adding attachments to the e-mail is simple. In order to attach a file, we use addAttachment method:
// attaches example.zip to the e-mail
$mail->addAttachment('path/to/example.zip');
// attaches new example.txt file with "Hello John!" in it
$mail->addAttachment('example.txt', 'Hello John!');
// attaches example.zip renamed to info.zip
$mail->addAttachment('info.zip', file_get_contents('path/to/example.zip'));
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->registerHelperLoader('Nette\Templating\Helpers::loader');
$template->orderId = 123;
$mail = new Message;
$mail->setFrom('John <john@example.com>')
->addTo('jack@example.com')
->setHtmlBody($template);
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);
You can also create your own mailer – it's a class implementing Nette\Mail\IMailer interface.