我是新來使用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訪問權限,我敢肯定,這是一個糟糕的主意......
你在配置中使用了什麼類型的隊列?因此,目前您的問題在隊列中,或者這是更多關於刪除文件後? – har2vey
@ har2vey正如我在** update 2 **中顯示的那樣,使用'Mail :: send()'封裝在一個'Queue :: push()'中,所以此時問題是關於刪除(缺少)權限文件 – slinkhi
所以我明白它*是*權限問題..我只是不知道什麼是最好的方法來克服它。我看到了兩個選擇:1)讓腳本(php)處理上傳/寫入文件,使其成爲所有者(我無法做到這一點,因爲它是第三方腳本,希望ftp位置將文件放入),或者2)給PHP根權限,以便它可以寫入(刪除)文件,而不管所有者(這聽起來像個壞主意)。所以我試圖找出一個可行的方案#3,到目前爲止,我一直無法做到這一點。 – slinkhi