2014-02-21 28 views
1

我是新來使用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/,因爲這些subdirs本身是由ftp用戶擁有的。我也試圖添加laravel/PHP下到同一組作爲FTP用戶的組運行用戶,但這並沒有工作。我想這是因爲該目錄/文件正被寫入僅由FTP用戶,而不是FTP用戶的組可寫的(也許是與黏着位?我得到的方式在我頭上的這一切......) 。

因此我可以隨便的唯一一件事就是爲用戶創建一個Web界面,通過那裏上傳文件,使PHP文件寫入到一個目錄,因此可以將其刪除。但我無法真正做到這一點,因爲這些文件實際上是通過第三方自動化進程上傳的,該進程只接受ftp位置來轉儲文件。

所以,我真的不知道該怎麼做,總之給人laravel/PHP的root訪問權限,我敢肯定,這是一個糟糕的主意......

+0

你在配置中使用了什麼類型的隊列?因此,目前您的問題在隊列中,或者這是更多關於刪除文件後? – har2vey

+0

@ har2vey正如我在** update 2 **中顯示的那樣,使用'Mail :: send()'封裝在一個'Queue :: push()'中,所以此時問題是關於刪除(缺少)權限文件 – slinkhi

+0

所以我明白它*是*權限問題..我只是不知道什麼是最好的方法來克服它。我看到了兩個選擇:1)讓腳本(php)處理上傳/寫入文件,使其成爲所有者(我無法做到這一點,因爲它是第三方腳本,希望ftp位置將文件放入),或者2)給PHP根權限,以便它可以寫入(刪除)文件,而不管所有者(這聽起來像個壞主意)。所以我試圖找出一個可行的方案#3,到目前爲止,我一直無法做到這一點。 – slinkhi

回答

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()包裹。

現在我有一個單獨的問題,涉及文件權限與刪除文件,所以這將是一個單獨的問題。

相關問題