如何为通过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
相关产品推荐
相关产品推荐

