【Laravel】 メールの基本的な送信方法
アカウント登録時やシステム通知など、メールを送信したいことはよくあります。基本的なメールの送り方、ファイルの添付の方法などを見ていきましょう。
目次
メールを送信するコード
Laravel Sailを用いたローカル環境ではMailHogを用いたローカルメールの受信が可能です。まずはこれを用いてメールを送信するコードを試してみましょう。
docker-compose.yaml
を見ると、http://localhost:8025
でアクセスできることが分かります。
Mailableの作成
まずは、メール送信に関するMailable
クラスを作成します。
php artisan make:mail NotifyLogin
そうすると、app/Mail
ディレクトリ内にクラスが作成されます。
build
build
メソッドでは、メール本文を組み立てます。ここで組み立てるメール本文には、普通にWebページを表示する時と同様にview
関数を用います。もちろんblade
を利用できます。
public function build() { return $this->view('mails.sample'); }
from
from
は、メールの送信者を表すものです。->from(mail, name)
のようにします。
public function build() { return $this->from('hoge@example.com', 'hogehoge') ->view('mails.sample'); }
その他
あとは自由に値を入れます。コンストラクタに用意しておきましょう。
namespace App\Mail; use App\Models\User; // ... class NotifyLogin extends Mailable { use Queueable, SerializesModels; private $user = null; public function __construct(User $user) { $this->user = $user; } public function build() { return $this->from('hoge@example.com', 'hogehoge') ->view('mails.sample', ['user' => $this->user]); } }
送信
作ったクラスを使用して送信します。送信には、Mail
ファサードを用います。
use Illuminate\Support\Facades\Mail; // ... Mail::to('fuga@example.com')->send(new NotifyLogin($user));
これで、fuga@exmaple.com
に対してNotifyLogin
のbuild
で作成されたHTMLがメールとして送信されます。
Mailableの設定
上では、build
メソッドでfrom
とview
を設定しました。他にも様々な設定やファイルの添付などが可能です。
view
view
では、実際に送信するメールの本文を作成します。コントローラでビューを呼び出した時と同様にblade
を用い、値を渡したりコンポーネントを用いたりすることができます。
return $this->from('hoge@example.com', 'hogehoge') ->view('mails.sample', [ 'user' => $this->user, 'server' => $_SERVER, ]);
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous"> <p>{{ $user->name }}が{{ $server['REMOTE_ADDR'] }}からログインされました</p> <button class="btn btn-primary">サンプルボタン</button> <x-alert> <x-slot name="message"> メッセージ </x-slot> </x-alert>
<div class="alert alert-warning"> {{ $message }} </div>
値を渡す際は、view
関数に値を渡すコードを置かなくても、フィールドをpublic
にすればビューからアクセスできます。
class NotifyLogin extends Mailable { use Queueable, SerializesModels; public $user = null; public function __construct(User $user) { $this->user = $user; } public function build() { // $this->userは渡さなくて良い return $this->view('mails.sample', [ 'server' => $_SERVER, ]); } }
<p>{{ $user->name }}が{{ $server['REMOTE_ADDR'] }}からログインされました</p>
テキスト形式のメール
メールでは、HTML形式だけでなく、普通のテキスト形式でも作成できます。テキスト形式の場合は、view
の代わりにtext
を用います。
ここで、メールの仕様上でもですが、HTMLメールとテキストメールは1つのメールに共存できます。HTMLを表示できない場合はテキスト版が表示されます。
しかし、現在ではどこもHTMLメールが主流となっているため、あまり使用しないかもしれません。
return $this->view('mails.sample', [ 'user' => $this->user, 'server' => $_SERVER, ])->text('mails.sampletext', [ // ... ]);
from
from
では、メールの送信者を設定できます。->from(mail, name)
のようにし、name
は省略できます。
// hoge@example.com が送信、送信者名はhogehoge return $this->from('hoge@example.com', 'hogehoge') ->view('mails.sample', [ 'user' => $this->user, 'server' => $_SERVER, ]);
グローバル設定
fromアドレスはしばしばどのメールでも共通した設定になります。そのような設定を行いたい場合、config/mail.php
に設定があります。
return [ // ... 'from' => [ 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), 'name' => env('MAIL_FROM_NAME', 'Example'), ], // ... ];
これを設定することで、毎回->from('hoge@example.com', 'name')
のように書く必要はなくなり、
return $this->view('mails.sample', [ 'user' => $this->user, 'server' => $_SERVER, ]);
で良くなります。
ファイルの添付
メールではしばしばファイルを添付します。添付するには、attach
メソッドを用います。Laravelのストレージから添付したい場合、attachFromStorage
が楽です。
public function build() { return $this->view('mails.sample', [ 'user' => $this->user, 'server' => $_SERVER, ])->attachFromStorage('images/hoge.png'); }
return $this->view('mails.sample', [ 'user' => $this->user, 'server' => $_SERVER, ])->attach('path/to/file');
ローカルでのMailHogでは、添付ファイルはMIMEタブからダウンロードできます。
attach(storage_path('app/images/hello.png'))
は、attachFromStorage('images/hello.png')
に置き換えられます。つまりapp/
が不要になります。
ファイル名やmime-typeを変更したい場合、attach
では第2引数に配列で指定します。
return $this->view('mails.sample', [ 'user' => $this->user, 'server' => $_SERVER, ])->attach(storage_path('app/images/hoge.png', [ 'as' => 'abc.png', 'mime' => 'image/png' ]));
attachFromStorage
の場合、第2引数にファイル名、第3引数にその他オプションを設定します。
return $this->view('mails.sample', [ 'user' => $this->user, 'server' => $_SERVER, ])->attachFromStorage('images/hello.png', 'aaa.png', [ 'mime' => 'image/png' ]);
生データを添付
ストレージからの読み込みではなく、変数に入っているバイトデータなどを添付したい場合、attachData
を用います。
$s = <<<EOS a,b,c xxx,yyy,zzz EOS; return $this->view('mails.sample', [ 'user' => $this->user, 'server' => $_SERVER, ])->attachData($s, 'hoge.csv', [ 'mime' => 'text/csv' ]);
まとめ
Laravelでは、Mail
ファサードとMailable
クラスのインスタンスを用いてメールを送信します。ファイルの添付はattach
等を用いて簡単に添付できます。from
の設定はconfig/mail.php
から共通設定が可能なので、ここから設定しておきましょう。
