Laravel邮件错误

时间:2017-04-09 17:01:57

标签: php laravel swiftmailer

不久前,我开始收到我在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”命令)。我不知道什么是错的,并且找不到任何有助于在线的东西,所以任何帮助都会很棒

目前的版本是:

  • “laravel / framework”:“5.2。*”//来自“composer.json”
  • “swiftmailer / swiftmailer”:“~5.1”(更新后的v5.4.6)//来自“laravel / framework / composer.json”

--- 编辑 ---
我发现这是某种加载(Dependency Injection)问题,所以我执行了这行代码:

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

结果为array(0) { }

1 个答案:

答案 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天。