Mail

Sending
E-mails

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.