Laravel 佇列訊息與傳送郵件

她來聽我的演唱會發表於2020-07-29

前期準備:

  1. 開發環境:homestead(Ubuntu 18.04 LTS+php 7.2.30+mysql 5.7.22)
    確保安裝了redis擴充套件,如無安裝,請執行:
    composer require predis/predis
  2. 配置資訊
    config/queue.phpconnections中配置:
    'redis' => [
             'driver' => 'redis',
             'connection' => 'default',
             'queue' => env('REDIS_QUEUE', 'default'),
             'retry_after' => 90,
             'block_for' => null,
         ],
    在.env檔案中配置傳送郵件的郵箱:
    MAIL_MAILER=smtp
    #郵箱伺服器地址
    MAIL_HOST=smtp.163.com
    MAIL_PORT=25
    #郵箱賬號
    MAIL_USERNAME=XXX@163.com
    #POP3/SMTP服務密碼
    MAIL_PASSWORD=XXXX
    MAIL_ENCRYPTION=null
    #可以隨便填寫字串,但是一定不能為空
    MAIL_FROM_ADDRESS=null
    MAIL_FROM_NAME="${APP_NAME}"
    在此有個需要注意的地方,MAIL_PASSWORD不是郵箱的登入密碼,而是POP3/SMTP服務密碼(設定方法)。
    注意:本例子中使用的是網易郵箱和SMTP,不同驅動下的伺服器地址、埠號均不同:
  • 伺服器地址:
    POP3伺服器: pop.163.com
    SMTP伺服器: smtp.163.com
    IMAP伺服器: imap.163.com
    安全支援:
    POP3/SMTP/IMAP服務全部支援SSL連線
  • 埠:
    網易郵箱埠

    開發階段:

  • 生成生成任務類

執行命令:

php artisan make:job SendEmail

執行成功在app/Jobs目錄下生成SendEmail類。修改類的內容後如下:

namespace App\Jobs;
use App\Models\UserInfo;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SendEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    protected $user;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(UserInfo $user)
    {
        //
        $this->user = $user;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle(Mailer $mailer)
    {
        //
        $user = $this->user;
        $mailer->send('emails.reminder',['user'=>$user],function($message) use ($user){
            $message->to($user->email)->subject('新功能釋出');
        });
    }
}

參考資料:Laravel 佇列系列 —— 基於 Redis 實現任務佇列的基本配置和使用

  • 編寫呼叫函式:
    <?php
    namespace App\Admin\Controllers;
    use App\Http\Controllers\Controller;
    use App\Jobs\SendReminderEmail;
    use App\Models\UserInfo;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Redis;
    class ApiController extends Controller
    {
      private $redis;
      public function __construct(){
          $this->redis = Redis::connection('default');
      }
      public function test(Request $request){
          //方便測試,寫死
          $user = UserInfo::find(1);
          $this->dispatch(new SendReminderEmail($user));
      }
    }
    加上測試路由:
    Route::group([
      'prefix' => 'admin',
      'middleware' => ['web'],
    ], function (Router $router) {
      $router->any('api/{action}', function ($action) {
          $ctrl = \App::make("\\App\\Admin\\Controllers\\ApiController");
          return \App::call([$ctrl, $action]);
      });
    });

    測試階段:

    呼叫xxx.test/api/test
    得出結果:
    QQ郵箱收到郵件提醒
    進入檢視郵件:
    收到郵件

至此,郵件傳送成功完成!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章