2017-04-09 72 views
0

不久前,我开始接受这个奇怪的错误,在我的Laravel应用邮件发送,错误是: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()被称为不带参数(这实际上是错误显示)

而且我更新了我所有的库(与“作曲家更新“命令)。我不知道有什么可以是错误的,并不能找到任何在线帮助,所以任何帮助将是巨大的

当前版本是:

  • “laravel /框架”:“5.2 *”从 “laravel /框架/ composer.json”

--- “〜5.1”(更新后v5.4.6)//:从 “composer.json”

  • “swiftmailer/swiftmailer” //编辑 ---
    我在某处发现这是某种形式加载(依赖注入)的问题,所以我执行这行代码:

    var_dump(Swift_DependencyContainer::getInstance()->createDependenciesFor('transport.smtp')); 
    

    ,并得到这个作为结果array(0) { }

  • 回答

    0

    如果有人有兴趣,我找到答案(有朋友帮忙)。问题是与PHP版本不兼容,显然SwiftMailer库不适用于较新版本的PHP(> 5.5.9,可能只有很少的版本,不知道从哪个版本开始失败)。

    失败是由于某些自动加载冲突。解决这个问题的方法是从懒加载恢复到预加载,这会减慢一点响应时间,但在大多数情况下,您甚至不会注意到(在我的情况下,我没有看到任何性能下降)。

    具体的解决方案:
    查找%APP%/供应商/ 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天试图解决这个问题。