You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为通过Symfony Mailer发送的Monolog邮件设置HTML样式?

解决方案

默认MailerHandler使用纯文本的LineFormatter处理日志内容,你只需要替换为Monolog内置的HtmlFormatter,并将格式化后的内容注入邮件的HTML部分即可,修改后的代码如下:

<?php
use Monolog\Logger;
use Monolog\Formatter\HtmlFormatter;
use Monolog\Handler\MailerHandler;
use Symfony\Component\Mailer\Mailer;
use Symfony\Component\Mailer\Transport;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;

$logger = new Logger('My Logger');

$transport = Transport::fromDsn('MYDSN');
$mailer = new Mailer($transport);

// 初始化HTML格式化器
$htmlFormatter = new HtmlFormatter();

$message = (new Email())
    ->from(new Address('from@example.com', 'John Doe'))
    ->to(new Address('to@example.com', 'Jane Doe'))
    ->subject('My Subject');

$mailerHandler = new MailerHandler(
    $mailer,
    $message,
    Logger::ERROR
);
// 给Handler设置HTML格式化器
$mailerHandler->setFormatter($htmlFormatter);

$logger->pushHandler($mailerHandler);

如果需要同时兼容纯文本邮件客户端,可以自定义Handler的内容生成逻辑,同时设置邮件的纯文本和HTML内容,示例如下:

// 同时声明纯文本和HTML格式化器
$textFormatter = new \Monolog\Formatter\LineFormatter();
$htmlFormatter = new HtmlFormatter();

// 继承MailerHandler重写内容添加逻辑
$mailerHandler = new class ($mailer, $message, Logger::ERROR) extends MailerHandler {
    protected function addContent(\Symfony\Component\Mime\Email $email, string $htmlContent): void
    {
        $logRecords = $this->getRecords();
        $textContent = '';
        foreach ($logRecords as $record) {
            $textContent .= $this->formatter->format($record);
        }
        $email->text($textContent)->html($htmlContent);
    }
};
$mailerHandler->setFormatter($htmlFormatter);

注:内置HtmlFormatter生成的样式和原Swiftmailer时期Monolog输出的HTML邮件样式完全一致,无需额外调整样式即可达到你需要的效果。

内容的提问来源于stack exchange,提问作者GlennM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 18:09:03