不久前,我开始收到我在Laravel应用程序中发送邮件的奇怪错误,错误是:
ErrorException in EsmtpTransport.php line 55:
Argument 1 passed to Swift_Transport_EsmtpTransport::__construct() must implement interface Swift_Transport_IoBuffer, none given
有趣的是,我的邮件系统工作得很好,大约一年,没有更新(只有服务器和域名在几周前再次付费),所以我认为代码不是问题,我仔细检查了信息邮件认证系统,这些也是对的。
我跟踪了异常堆栈跟踪,发现在Swift_SmtpTransport::__construct()
参数中发送的参数是正确的,但是从那里调用Swift_EsmtpTransport::__construct()
没有参数(实际上显示错误)
我还更新了所有库(使用“composer update”命令)。我不知道什么是错的,并且找不到任何有助于在线的东西,所以任何帮助都会很棒
目前的版本是:
--- 编辑 ---
我发现这是某种加载(Dependency Injection)问题,所以我执行了这行代码:
var_dump(Swift_DependencyContainer::getInstance()->createDependenciesFor('transport.smtp'));
结果为array(0) { }
答案 0 :(得分:0)
如果有人有兴趣,我找到答案(与朋友帮助)。问题与PHP版本不兼容,显然SwiftMailer库不适用于较新版本的PHP(> 5.5.9,可能很少版本,不确定它从哪个版本开始失败)。
失败是因为一些自动加载冲突。这个问题的解决方案是从延迟加载恢复到预加载,这会减慢一点响应时间,但在大多数情况下你甚至都没有注意到(在我的情况下,我没有看到任何下降性能)。
具体解决方案:
找到%APP%/ vendor / swiftmailer / swiftmailer / lib / swift_requied.php 并将其更改为如下所示
<?php
/*
* This file is part of SwiftMailer.
* (c) 2004-2009 Chris Corbyn
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
/*
* Autoloader and dependency injection initialization for Swift Mailer.
*/
if (class_exists('Swift', false)) {
return;
}
// Load Swift utility class
require __DIR__.'/classes/Swift.php';
if (!function_exists('_swiftmailer_init')) {
function _swiftmailer_init()
{
require __DIR__.'/swift_init.php';
}
}
// Start the autoloader and lazy-load the init script to set up dependency injection
// Swift::registerAutoload('_swiftmailer_init');
_swiftmailer_init();
差异在最后一行,Swift::registerAutoload('_swiftmailer_init');
被注释掉,并且_swiftmailer_init
方法被直接调用。
希望这对某人有帮助,因为我试图解决这个问题已经失去了大约2天。