nette/mail
Lightweight PHP mailer from the Nette framework: compose and send emails with SMTP support, MIME messages, attachments, HTML/text bodies, and headers. Sensible defaults, easy integration, and good testability for apps and services.
dev@example.com redirection) by integrating seamlessly with Laravel’s DI container. Configurable via mail.redirect env var, ensuring zero-code changes for dev teams.Mailable by offering pre-processing pipelines (CSS inlining, image embedding, subject extraction) as standalone components. Avoids reinventing wheels for complex email templates.mail: debugger: true|false), preserving backward compatibility with existing Nette\Mail integrations.#[MailRedirect]), which are PHP 8.2+ only but isolated to optional components.$this->app->bind(\Nette\Mail\Interceptor::class, function ($app) {
$interceptor = new \Nette\Mail\Interceptor(
new \Nette\Mail\SmtpMailer($app['config']['mail.mailers.smtp'])
);
$interceptor->redirectTo(env('MAIL_REDIRECT', 'dev@example.com'));
return $interceptor;
});
Mail facade to use the interceptor:
class Mailer extends \Illuminate\Mail\Mailer {
public function send($mailer, MailMessage $message) {
$interceptor = app(\Nette\Mail\Interceptor::class);
return $interceptor->send($message);
}
}
tracy/tracy package (if installed). Enable via:
$this->app->singleton('mail.debugger', function () {
return config('mail.debugger', false);
});
Tracy\Debugger::enable(
Tracy\IBarPanel::BLUE,
config('mail.debugger', false) ? ['mail'] : []
);
Mailable classes:
class ComposedMailable extends Mailable {
public function build() {
$html = $this->html;
$composer = new \Nette\Mail\HtmlComposer;
$composer->inlineCss($html);
$composer->embedImages(storage_path('app/public'));
$this->message->setHtmlBody($composer->getHtml());
}
}
To/Cc/Bcc headers are stored in X-Original-* headers. Ensure compliance with email clients (e.g., Outlook may strip custom headers).mail.debugger: false).dev@example.com may expose PII (e.g., passwords in reset links). Use sanitization or environment-specific redirects.maxImageSize in HtmlComposer.Nette\Mail grows.#[MailRedirect]) are optional and won’t break existing code.HtmlComposer for all emails or only high-priority templates (e.g., marketing)?X-Original-To) acceptable in production, or should they be stripped post-redirection?tracy/tracy.dev@example.com workarounds, reducing human error in email testing. Works with Laravel’s MailFake for unit testing.Mailable layer.Mail::later()). Interceptor can be disabled in production queues via config.MAIL_REDIRECT=dev@example.com
MAIL_DEBUGGER=true
HtmlComposer in marketing emails first.$composer = new \Nette\Mail\HtmlComposer;
$composer->inlineCss($html)->embedImages(public_path('images'));
$message->setHtmlBody($composer->getHtml());
MAIL_REDIRECT=staging@example.com in staging).premailer/premailer).| Laravel Feature | Nette Mail v4.1.2 Support | Workaround |
|---|---|---|
| Tracy Debugger | Yes (auto-integrates) | Enable with MAIL_DEBUGGER=true. |
| Queued Emails | Yes (Interceptor works with queues) | Disable via MAIL_REDIRECT=null in production. |
| Markdown Emails | No (use Laravel’s MarkdownMailable) |
Pre-process with Laravel, pass to HtmlComposer. |
| SwiftMailer Legacy | Partial (Interceptor wraps Nette\Mail) |
Full replacement recommended. |
| Custom Headers | Yes (Interceptor preserves originals) | Use X-Original-* headers. |
| Attachment Handling | Yes (supports files, CIDs) | No changes needed. |
config/mail.php:
'interceptor' => [
'redirect' => env('MAIL_REDIRECT', null),
'debugger' => env('MAIL_DEBUGGER', false),
],
AppServiceProvider:
$this->app->singleton(\Nette\Mail\Interceptor::class, function ($app) {
$mailer = $app['mail.manager']->mailer();
$interceptor = new \Nette\Mail\
How can I help you explore Laravel packages today?