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

Laravel 11中调试邮件发送并输出SMTP对话的实现方案

Laravel 11 适配SMTP发送测试并打印SMTP对话代码

问题背景

需要一段用于测试Laravel邮件SMTP发送并打印SMTP对话的代码片段,SMTP对话包含的消息ID可用于追踪未送达的邮件。旧版Laravel中使用以下代码:

$to = 'foo@example.com';

Mail::getSwiftMailer()->registerPlugin(new Swift_Plugins_LoggerPlugin(new Swift_Plugins_Loggers_EchoLogger(false)));

Mail::raw('Testmail', function ($message) use ($to) {
    $message->to($to)->subject('Testmail');
});

但在Laravel 11中运行时出现错误:

BadMethodCallException  Method Illuminate\Mail\Mailer::getSwiftMailer does not exist.

原因是Laravel 11 采用 Symfony Mailer 替代了原有的 SwiftMailer,原有代码无法兼容,需要进行适配。

适配后的代码实现

基础实现:捕获消息ID与基础SMTP日志

use Symfony\Component\Mailer\EventListener\MessageLoggerListener;
use Illuminate\Support\Facades\Mail;

$to = 'foo@example.com';

// 获取Laravel封装的Symfony邮件传输实例
$transport = Mail::getSymfonyTransport();

// 初始化消息日志监听器,用于捕获邮件消息及相关元数据
$loggerListener = new MessageLoggerListener();
$transport->getDispatcher()->addSubscriber($loggerListener);

// 发送测试邮件
Mail::raw('Testmail', function ($message) use ($to) {
    $message->to($to)->subject('Testmail');
});

// 输出捕获到的消息ID及基础信息
foreach ($loggerListener->getMessages() as $message) {
    echo "消息ID(Message-ID): " . $message->getHeaders()->get('Message-ID')->getValue() . "\n";
}

进阶实现:打印完整SMTP对话

若需要打印完整的SMTP交互对话,需为SMTP传输配置日志器,以下是控制台输出的示例:

use Symfony\Component\Mailer\EventListener\MessageLoggerListener;
use Illuminate\Support\Facades\Mail;
use Symfony\Component\Mailer\Transport\Smtp\EsmtpTransport;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Symfony\Component\HttpClient\Logging\Logger as HttpClientLogger;

$to = 'foo@example.com';

$transport = Mail::getSymfonyTransport();

// 配置Monolog日志器,将SMTP调试日志输出到控制台
$smtpLogger = new Logger('smtp_debug');
$smtpLogger->pushHandler(new StreamHandler('php://stdout', Logger::DEBUG));

// 为SMTP传输绑定日志器
if ($transport instanceof EsmtpTransport) {
    $transport->setLogger(new HttpClientLogger($smtpLogger));
}

// 添加消息监听器捕获消息ID
$loggerListener = new MessageLoggerListener();
$transport->getDispatcher()->addSubscriber($loggerListener);

// 发送测试邮件
Mail::raw('Testmail', function ($message) use ($to) {
    $message->to($to)->subject('Testmail');
});

// 输出消息ID
foreach ($loggerListener->getMessages() as $message) {
    echo "\n消息ID(Message-ID): " . $message->getHeaders()->get('Message-ID')->getValue() . "\n";
}

说明

  • Laravel 11 中 Mail::getSymfonyTransport() 替代了旧版的 getSwiftMailer(),用于获取底层邮件传输实例。
  • Symfony Mailer 通过事件监听机制捕获邮件元数据,MessageLoggerListener 可获取邮件的消息ID等关键信息。
  • 完整SMTP对话的打印依赖于为SMTP传输配置日志器,示例中使用Monolog将DEBUG级别的日志输出到控制台,也可配置为写入日志文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 16:25:17