Laravel Mailable排队无法正常工作

时间:2017-05-19 05:49:53

标签: php email laravel-5

我正在尝试排队我的laravel邮件。我正在使用redis将邮件排队。

当我发送电子邮件时,queue:listen函数开始向laravel.log

添加错误时邮件没有通过

这是我的可邮寄代码

use Queueable, SerializesModels;
    protected $bdy=array();
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($bdy)
    {
        $this->content = $bdy;
        $from_name=$this->content['from_name'];
        $from_email=$this->content['from_email'];
        $subject=$this->content['subject'];
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->from("$from_email")->subject("$subject")->view('emails.blank')->with(['content'=>$this->content]);
    }

邮件控制器代码在这里

  $content = str_replace("{name}", $lst->name, $content);

            $bdy=[
                'message'=>$content,
                'from_email'=>$send_from_email,
                'from_name'=>$send_from_name,
                'subject'=>$subject
            ];


         $today=date("Y-m-d H:i:s",strtotime(date("Y-m-d H:i:s")." +2 minutes"));
            Mail::to($lst)->later($today,new MailRoom1($bdy));

我在laravel.log文件中收到的错误是

Stack trace:
#0 /var/www/html/app/Mail/MailRoom1.php(34): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'Undefined varia...', '/var/www/html/a...', 34, Array)
#1 [internal function]: App\Mail\MailRoom1->build()
#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(29): call_user_func_array(Array, Array)
#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(87): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(31): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/Container.php(531): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Mail/Mailable.php(116): Illuminate\Container\Container->call(Array)
#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Mail/SendQueuedMailable.php(52): Illuminate\Mail\Mailable->send(Object(Illuminate\Mail\Mailer))
#8 [internal function]: Illuminate\Mail\SendQueuedMailable->handle(Object(Illuminate\Mail\Mailer))
#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(29): call_user_func_array(Array, Array)
#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(87): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#11 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(31): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/Container.php(531): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#13 /var/www/html/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(94): Illuminate\Container\Container->call(Array)
#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(114): Illuminate\Bus\Dispatcher->Illuminate\Bus\{closure}(Object(Illuminate\Mail\SendQueuedMailable))
#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Mail\SendQueuedMailable))
#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(98): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(42): Illuminate\Bus\Dispatcher->dispatchNow(Object(Illuminate\Mail\SendQueuedMailable), false)
#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(69): Illuminate\Queue\CallQueuedHandler->call(Object(Illuminate\Queue\Jobs\RedisJob), Array)
#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(291): Illuminate\Queue\Jobs\Job->fire()
#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(258): Illuminate\Queue\Worker->process('redis', Object(Illuminate\Queue\Jobs\RedisJob), Object(Illuminate\Queue\WorkerOptions))
#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(110): Illuminate\Queue\Worker->runJob(Object(Illuminate\Queue\Jobs\RedisJob), 'redis', Object(Illuminate\Queue\WorkerOptions))
#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(100): Illuminate\Queue\Worker->daemon('redis', 'default', Object(Illuminate\Queue\WorkerOptions))
#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(83): Illuminate\Queue\Console\WorkCommand->runWorker('redis', 'default')
#24 [internal function]: Illuminate\Queue\Console\WorkCommand->fire()
#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(29): call_user_func_array(Array, Array)
#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(87): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(31): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/Container.php(531): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#29 /var/www/html/vendor/laravel/framework/src/Illuminate/Console/Command.php(182): Illuminate\Container\Container->call(Array)
#30 /var/www/html/vendor/symfony/console/Command/Command.php(262): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#31 /var/www/html/vendor/laravel/framework/src/Illuminate/Console/Command.php(167): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#32 /var/www/html/vendor/symfony/console/Application.php(826): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#33 /var/www/html/vendor/symfony/console/Application.php(190): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Queue\Console\WorkCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#34 /var/www/html/vendor/symfony/console/Application.php(121): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#35 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(123): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#36 /var/www/html/artisan(35): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#37 {main}  
[2017-05-18 18:25:00] local.ERROR: ErrorException: Undefined variable: from_email in /var/www/html/app/Mail/MailRoom1.php:34

谁能告诉我我做错了什么?

3 个答案:

答案 0 :(得分:3)

不需要让事情变得复杂,让这样的课程如下:

public $content;

public function __construct( $bdy ) {
    $this->content = $bdy;
}

public function build() {
    return $this->from($this->content['from_email'])
                ->subject($this->content['subject'])
                ->view('emails.blank')
                ->with(['content'=>$this->content]);
}

就是这样。

注意:您无需添加->with(['content'=>$this->content]),因为您的公开变量$this->content已在您的模板'emails.blank'上可用,变量为{{ 1}}。看看mailable

答案 1 :(得分:1)

$ from_email只能在您的构造函数中使用,您希望将其设置为类的属性,以便您可以访问其他地方

protected $from_name;

protected $from_email;

protected $subject;

/**
 * Create a new message instance.
 *
 * @return void
 */
public function __construct($bdy)
{
    $this->content = $bdy;
    $this->from_name=$this->content['from_name'];
    $this->from_email=$this->content['from_email'];
    $this->subject=$this->content['subject'];
}

public function getFromEmail()
{
    return $this->from_email;
}

public function getFromName()
{
    return $this->from_name;
}

public function getSubject()
{
    return $this->subject;
}


/**
 * Build the message.
 *
 * @return $this
 */
public function build()
{
    return $this->from($this->getFromEmail())->subject($this->getSubject())->view('emails.blank')->with(['content'=>$this->content]);
}

答案 2 :(得分:0)

你可以这样做。此外,您可以在视图中访问任何声明为公开的属性。

public $content = array();

public $from = array();

public $subject;

function __construct($body)
{
    $this->content = $body['message'];

    $this->from = [
        'address' => $body['from_email'],
        'name' => $body['from_name']
    ];

    $this->subject = $body['subject'];
}

public function build()
{
    return $this->from($this->from)
        ->subject($this->subject)
        ->view('emails.blank')
        ->with(['content' => $this->content]);
}