【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に対してNotifyLoginbuildで作成されたHTMLがメールとして送信されます。

Mailableの設定

上では、buildメソッドでfromviewを設定しました。他にも様々な設定やファイルの添付などが可能です。

view

viewでは、実際に送信するメールの本文を作成します。コントローラでビューを呼び出した時と同様にbladeを用い、値を渡したりコンポーネントを用いたりすることができます。

return $this->from('hoge@example.com', 'hogehoge')
    ->view('mails.sample', [
        'user' => $this->user,
        'server' => $_SERVER,
    ]);
app/resources/views/mails/sample.blade.php
<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>
app/resources/views/components/alert.blade.php
<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から共通設定が可能なので、ここから設定しておきましょう。

laravel mail thumb

役に立ったらシェアしよう!