使用Symfony Mailer时如何获取SentMessage对象?
获取Symfony Mailer的SentMessage对象
Symfony的MailerInterface::send()确实没有返回值,但有两种可靠方式获取SentMessage对象:
方法一:直接注入TransportInterface替代MailerInterface
TransportInterface::send()本身就会返回SentMessage,直接替换注入的类型即可:
use Symfony\Component\Mailer\Transport\TransportInterface; use Symfony\Component\Mailer\Exception\TransportExceptionInterface; use Symfony\Component\Mime\Email; class YourMailService { public function __construct(private TransportInterface $transport) { } public function sendNotification(): void { $message = (new Email()) ->from('sender@example.com') ->to('recipient@example.com') ->subject('Test Email') ->text('Hello World'); try { // 直接获取SentMessage对象 $sentMessage = $this->transport->send($message); // 调用所需方法 $originalMessage = $sentMessage->getOriginalMessage(); $debugInfo = $sentMessage->getDebug(); // 这里可以添加日志、存储等逻辑 } catch (TransportExceptionInterface $e) { echo $e->getDebug(); } } }
方法二:通过事件监听器获取(无需修改现有注入)
如果不想替换已有的MailerInterface,可以监听邮件发送完成的事件,在事件回调中获取SentMessage:
1. 创建事件监听器类
use Symfony\Component\Mailer\Event\MessageSentEvent; class SentMessageLogger { public function onMessageSent(MessageSentEvent $event): void { $sentMessage = $event->getSentMessage(); // 处理SentMessage,比如记录调试信息 $debugData = $sentMessage->getDebug(); // 示例:写入日志 // $this->logger->info('Email sent', ['debug' => $debugData]); } }
2. 注册监听器
在config/services.yaml中添加标签注册监听器:
services: App\EventListener\SentMessageLogger: tags: - { name: kernel.event_listener, event: 'Symfony\Component\Mailer\Event\MessageSentEvent', method: 'onMessageSent' }
两种方式对比
- TransportInterface注入:适合需要在发送邮件的同一代码流程中立即处理
SentMessage的场景,代码简洁直接。 - 事件监听器:适合全局监听所有邮件发送事件,或不想改动现有
MailerInterface注入逻辑的场景,解耦性更强。
内容的提问来源于stack exchange,提问作者endo.anaconda
相关产品推荐
相关产品推荐

