如何在mail :: queue调用后执行代码

时间:2014-02-21 03:52:18

标签: php email laravel-4

我是使用Laravel 4框架的新手,所以如果这是一个noob问题我很道歉(可能是......)

好的,基本上我的情况是我有一个脚本应该发送带附件的电子邮件。在发送电子邮件之后,我需要删除在电子邮件中附加和发送的文件。

到目前为止,我已经制作了以下代码:

    Mail::queue('email-report', array('hotel'=>$hotel), function($message)use($hotel,$matchedFiles)
    {
      $emails = array_map('trim',explode(",",$hotel->group_emails));
      $message->setTo($emails);
      $message->subject($hotel->email_subject);
      $message->from($hotel->email_alias);
      $message->replyTo($hotel->email_alias);
      foreach($matchedFiles as $mf) {
        $message->attach($mf);
      }
    });

就发送带有附件的电子邮件而言,此工作正常。

现在关于删除文件的部分(路径/到/文件是$matchedFiles是什么)。现在,我不认为我可以在调用Mail::queue()之后删除它们,因为这会将作业放入队列中以便稍后执行,因此文件需要稍后存在,是吗?

所以我需要等到队列中的作业完成,然后删除文件,对吧?但是,怎么样?我一直在寻找Laravel 4文档并试图谷歌但我似乎无法弄清楚是否有一些回调方法我可以放入代码或什么..

修改

好吧所以我一直在做更多的阅读和研究,似乎有一件事我可以做而不是使用Mail::queue(),我使用Mail::send()然后将它包装在一个作业处理程序类中然后将作业处理程序类推送到Queue::push()。所以我将尝试这个并看看它是否有效......我不知道如何将上面的代码转换为作业处理程序类,特别是将额外的变量传递给它,但这是向前迈出的一步。

无论如何......看起来应该已经有了内置的回调,所以也许有人会评论/回答。

编辑2

好的,所以我能够按照我上面的想法获得一些代码来执行:

$data = array(
  'view' => 'email-report',
  'hotel' => $hotel,
  'matchedFiles' => $matchedFiles
);

Queue::push(function($job) use ($data)
{

  $hotel = $data['hotel'];
  $matchedFiles = $data['matchedFiles'];

  Mail::send('email-report', array('hotel'=>$hotel), function($message)use($hotel,$matchedFiles)
  {
    $emails = array_map('trim',explode(",",$hotel->group_emails));
    $message->setTo($emails);
    $message->subject($hotel->email_subject);
    $message->from($hotel->email_alias);
    $message->replyTo($hotel->email_alias);
    foreach($matchedFiles as $mf) {
      $message->attach($mf);
    }
  });

  /* this doesn't work - permission issues
  foreach($matchedFiles as $mf) {
    //File::delete($mf);
    //unlink($mf);
  }
  */

  // test i used to see if i can make code execute in general. It works!
  DB::insert('insert into table (column1,column2,column3) values (?,?,?)',
             array(
               $job->getJobId(),
               $hotel->hotel_id,
               implode(',',$matchedFiles)
              )
            );


  $job->delete();

});

所以这可行,因为我仍然可以排队发送电子邮件,但在完成后会获得一些代码来执行。所以我猜这解决了我的问题......也许吧?实际上,我不确定这个真的是否有效,因为权限问题我无法让文件实际删除。

文件上传到ftp目录,但是laravel / php正由其他用户/组执行。所以我不知道如何处理这个...文件实际上是ftp用户可以创建的/path/to/ftp/location/的子目录。所以我不能让laravel / php用户/组拥有/path/to/ftp/location/,因为子目录本身是由ftp用户拥有的。我还尝试将laravel / php运行的用户添加到与ftp用户组相同的组中,但这不起作用。我认为这是因为dirs /文件只能被ftp用户写入,而不是ftp用户的组(可能与粘性位有关?我在这一切中都已经超越了我......) 。

所以我唯一能想到的就是创建一个Web界面供用户通过那里上传文件,以便php将文件写入目录,因此可以删除它们。但我真的不能这样做,因为文件实际上是通过第三方自动进程上传的,只接受ftp位置转储文件。

所以我不确定该做什么,没有给laravel / php root访问权限,我很确定这是一个坏主意......

1 个答案:

答案 0 :(得分:0)

所以最初的问题是如何在Mail::queue()完成它之后执行一些代码。根据我的编辑2 ,这回答了我原来的问题:

$data = array(
  'view' => 'email-report',
  'hotel' => $hotel,
  'matchedFiles' => $matchedFiles
);

Queue::push(function($job) use ($data)
{

  $hotel = $data['hotel'];
  $matchedFiles = $data['matchedFiles'];

  Mail::send('email-report', array('hotel'=>$hotel), function($message)use($hotel,$matchedFiles)
  {
    $emails = array_map('trim',explode(",",$hotel->group_emails));
    $message->setTo($emails);
    $message->subject($hotel->email_subject);
    $message->from($hotel->email_alias);
    $message->replyTo($hotel->email_alias);
    foreach($matchedFiles as $mf) {
      $message->attach($mf);
    }
  });

  /* this doesn't work - permission issues
  foreach($matchedFiles as $mf) {
    //File::delete($mf);
    //unlink($mf);
  }
  */

  // test i used to see if i can make code execute in general. It works!
  DB::insert('insert into table (column1,column2,column3) values (?,?,?)',
             array(
               $job->getJobId(),
               $hotel->hotel_id,
               implode(',',$matchedFiles)
              )
            );


  $job->delete();

});

基本上答案是使用Mail::send()并将其包装在Queue:push()中。

现在我有一个关于文件权限与删除文件的单独问题,因此这将是一个单独的问题。