Laravel5.6使用定時任務實現定時發郵件

著了迷發表於2018-08-17

一、建立專案

****1、開啟終端,執行命令:laravel new crontab,包括資料庫,確保本地能正常執行。隨後部署上線。phpstrom連線伺服器,確保程式碼可以正常提交到伺服器。

2、建立任務類,終端執行命令:php artisan make:command SendEmail

3、修改 SendEmail.php 檔案****

protected $signature = 'email:send';
protected $description = '定時發郵件測試';
複製程式碼

4、先不慌做發郵件,先來個檔案定時寫入測試,在檔案中寫入當前時間,程式碼如下

public function handle()
{
  //寫入檔案
  file_put_contents("/var/www/crontab/file.txt", date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND);
}
複製程式碼

注:這裡的PHP_EOL代表時間列表換行,後面的FILE_APPEND是指往後追加一條記錄。

5、修改app/Console/Kernel.php檔案:

protected $commands = [
    Commands\SendEmail::class //註冊任務類
];

protected function schedule(Schedule $schedule)
{
    //每分鐘執行一次檔案的寫入
    $schedule->command('email:send')
        ->everyMinute();
}
複製程式碼

****6、伺服器上,進入專案:cd /var/www/crontab,先檢視伺服器上PHP安裝路徑,執行命令:which php,我的PHP路徑是/usr/bin/php,然後把路徑複製儲存下來,接著執行命令:crontab -e,選擇開啟方式,建議選擇第4個。在最後一行增加如下程式碼: **

* * * * * /usr/bin/php /var/www/crontab/artisan schedule:run >> /dev/null 2>&1
複製程式碼

注:這裡前面一部分/usr/bin/php代表伺服器上PHP的安裝路徑,後面一部分代表專案目錄。 另外上面的命令前面的5個星號*分別代表分鐘、小時、天、月、星期。

分鐘:0-59的整數,預設星號和星號/1 代表1分鐘。 小時:0-23的整數

天:1-31的整數。

月:1-12的整數。

星期:0-7的整數,0和7都代表星期日。

crontab -l 可以列出當前的定時任務。 **

7、啟動任務sudo service cron restart,檢視伺服器上專案的根目錄下的file.txt檔案中是否有時間寫入並且每分鐘執行一次。確認成功後,執行命令 service cron stopexit退出定時任務。**

Laravel5.6使用定時任務實現定時發郵件

二、實現定時發郵件

接下來要做的是把寫入檔案的操作換成定時發郵件。在.env檔案配置發郵件所需的相關資訊。

MAIL_DRIVER=smtp
MAIL_HOST=smtp.qq.com
MAIL_PORT=465
MAIL_USERNAME=1185079673@qq.com
MAIL_PASSWORD=***** //填自己的郵箱密碼()
MAIL_ENCRYPTION=ssl
複製程式碼

這個郵箱密碼是你郵箱設定生成的授權碼

Laravel5.6使用定時任務實現定時發郵件

1、開啟web.php,新增路由

$this->any('mail', 'HomeController@mail');//發郵件
複製程式碼

2、在Home控制器中新增如下程式碼:

public function mail()
{
   //第一種方法
   \Mail::raw('定時傳送郵件 測試', function ($message) {
       $message->from('1185079673@qq.com', '吳親庫裡');
       $message->subject('郵件主題 測試');
       $message->to('1185079673@qq.com');
   });

  //第二種方法
// \Mail::send('admin.mail', ['name' => 'holy'], function ($message) {
//     $message->to('1185079673@qq.com');
// });
}
複製程式碼

測試:終端列印路由,拿到路由地址去瀏覽器中訪問:http://你的二級域名/admin/mail,檢視郵箱是否收到郵件。如果成功收到郵件,請繼續往下。。

3、開啟任務類 SendEmail.php檔案,修改handle方法,程式碼如下:

  public function handle()
    {
//        file_put_contents("/var/www/test/file.txt", '單身狗測試' . PHP_EOL, FILE_APPEND);
        Mail::raw('七夕單身狗測試郵件',function ($message){
            $message->from('1185079673@qq.com','吳親庫裡');
            $message->subject('你可能需要一點小小的幫助');
            $message->to('1185079673@qq.com');
    });
    }
複製程式碼

** 最後去伺服器的當前專案中,啟動定時命令 service cron restart,等一分鐘,檢視郵箱是否收到郵件並且每一分鐘執行一次。**

然後郵箱就爆了

Laravel5.6使用定時任務實現定時發郵件

**最後其實這個功能是不完善的,我現在傳送的只是單個郵箱。批量處理任務的場景在我們開發中是經常使用的,比如郵件群發,訊息通知,簡訊,秒殺等等,我們需要將這個耗時的操作放在佇列中來處理,從而大幅度縮短Web請求和相應的時間。

相關文章