【问题标题】:Laravel Mailable Queuing not workingLaravel 可邮寄队列不起作用
【发布时间】:2017-05-19 05:49:53
【问题描述】:

我正在尝试将我的 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

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

【问题讨论】:

    标签: php email laravel-5


    【解决方案1】:

    不用把事情复杂化,把类做成这样:

    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' 上可用,变量$content。看看mailable

    【讨论】:

      【解决方案2】:

      $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]);
      }
      

      【讨论】:

      • 现在我得到 $from_name、$from_email 和 $subject 必须是公开的
      • 将它们更改为 public 而不是 protected 或创建 getter 和 setter 函数
      • 我已经更新了答案以显示 getter 和 setters 方法
      【解决方案3】:

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

      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]);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-08
        • 2018-11-30
        • 2018-06-18
        • 2017-10-08
        相关资源
        最近更新 更多