0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

EC2のLaravel6.0環境でメール配信コマンドを作成する AWS/Laravel連載(16)

Posted at

はじめに

前回でMailgunを使いメールの配信ができるようになりました。

EC2のLaravel6.0環境で記事投稿時にメールMailgunを使いメール送信する AWS/Laravel連載(15)

実際のサービスでは、宣伝メールや重要なお知らせをユーザーに一括配信することもあるでしょう。
コマンドライン上でユーザーに一括配信する仕組みを今回は作っていきます。

公式ドキュメントを参考にしつつ、いろいろ独自実装で進めていきます。

ファイル作成

$ php artisan make:command SendEmails

実行すると、app/Console/Commands/SendEmails.php というファイルが生成されます。

次にMailableクラスを作ります。前回作ったのと同じ手順ですね。

$ php artisan make:mail ServiceNotice
app/Mail/ServiceNotice.php
 <?php

 namespace App\Mail;
-
+use App\User;
 use Illuminate\Bus\Queueable;
 use Illuminate\Mail\Mailable;
 use Illuminate\Queue\SerializesModels;
 use Illuminate\Contracts\Queue\ShouldQueue;

 class ServiceNotice extends Mailable
 {
     use Queueable, SerializesModels;
-
+    protected $user;

     /**
      * Create a new message instance.
      *
      * @return void
      */
-    public function __construct()
+    public function __construct(User $user)
     {
         //
+        $this->user = $user;
     }

     /**
      * Build the message.
      *
      * @return $this
      */
     public function build()
     {
+        return $this->from('your_address@example.com')
+                    ->subject('お知らせメール')
+                    ->markdown('emails.service_notice')
+                    ->with(['userName' => $this->user->name]);
     }
 }

メール本文はマークダウン記法で作ります。

$ touch resources/views/emails/service_notice.blade.php
resources/views/emails/service_notice.blade.php
@component('mail::message')
# 重要なお知らせです

テストメール

{{ config('app.name') }}
@endcomponent

コマンドファイルの修正

上記対応でMailableクラスの準備が終わったら、コマンドファイルを修正していきます。

app/Console/Commands/SendEmails.php
 namespace App\Console\Commands;


 use Illuminate\Console\Command;
+use App\User;
+use App\Mail\ServiceNotice;
+use Illuminate\Support\Facades\Mail;
 
 class SendEmails extends Command
...

-    protected $signature = 'command:name';
+    protected $signature = 'email:send {user : ユーザーIDを指定}';
...

-    protected $description = 'Command description';
+    protected $description = '指定ユーザーにメールを配信する';
...
     public function handle()
     {
-        //
+        $user = User::find($this->argument('user'));
+        if ($this->confirm($user->name . 'さん[' . $user->email . ']にメールを配信しますか?')) {
+            Mail::to($user)->send(new ServiceNotice($user));
+        }
     }
...

少し中身の解説です。
$signatureはコマンドライン上で実行する際のコマンドを定義できます。

{user : ユーザーIDを指定}部分は引数で、コロン以降は説明文です。
$descriptionは説明文で、コマンド一覧等で確認できます。

以下、参照例です。

$ php artisan
...
 email
  email:send           指定ユーザーにメールを配信する
 event
  event:cache          Discover and cache the application's events and listeners
...
$ php artisan email:send --help
Description:
  指定ユーザーにメールを配信する

Usage:
  email:send <user>

Arguments:
  user                  ユーザーIDを指定

Options:
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
      --env[=ENV]       The environment the command should run under
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
...
        $user = User::find($this->argument('user'));
        if ($this->confirm($user->name . 'さん[' . $user->email . ']にメールを配信しますか?')) {
...

$this->argumentでコマンドライン実行時の引数を参照できます。

ユーザー取得後、$this->confirmで「本当にこのユーザーにメールを送るか?」のダイアログを出しています。

実行する

$ php artisan email:send 1

 hogeさん[your_address@example.com]にメールを配信しますか? (yes/no) [no]:
 >

ここでyesもしくはyを押してEnterを押すとメールが飛びます。

次回はLaravelにおけるCron設定の方法を紹介します。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?