Laravelでメール送信

laravel

laravel8でメールを送る方法について。たぶん他のバージョンでも同じだと思う。

プロジェクトの作成

まず、テスト用のプロジェクトをsandboxという名前で作成する。

$ composer create-project laravel/laravel sandbox --prefer-dist

クラスの作成

次にコマンドクラスとメールクラスを作成する。メールを送るだけであれば画面は必要ないので、今回はコマンド形式でメール送信を行う。

$ cd sandbox
$ php artisan make:command SampleMailBatch
$ php artisan make:mail SampleMail

メール送信関連設定の確認

.envを確認する。以下は特に難しい事はせずにそのままsendmailでメールを送る設定。

$ vi .env
:
MAIL_MAILER=sendmail
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"

簡易的にメールを送りたい場合

メールクラスもメールテンプレートも必要とせず、ただ単純にメールの送信を行いたい場合は、以下の様な呼び出しで送信が可能。

// クラス冒頭で呼び出す
use Illuminate\Support\Facades\Mail;

        // どこかのメソッド内でメール送信メソッドを以下のように呼べばOK
        Mail::raw('テストメール本文だよ', function($message){
            $message->to("mail_to@example.com")
                ->from('mail_from@example.com', 'メール送信元')
                ->subject("テストメール題名だよ");
        });

メール呼び出し元クラスの編集

先ほど生成したコマンドクラスを修正してメール送信を行う。

パスは普通に生成していれば、以下にあるはず。

[プロジェクトを生成したディレクトリ]/sandbox/app/Console/Command/SampleMailBatch.php

クラスファイルの内容は以下。

<?php
namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Mail;
use App\Mail\SampleMail;

class SampleMailBatch extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'batch:send-sample-mail';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Send Sample Mail Command';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        // メール題名
        $subject = 'メール題名';
        // ついでに送ってみる変数
        $now = date('Y-m-d H:i:s');
        // 添付ファイルのパスを指定(空も可)今回はREADMEを送ってみる
        $attach = [__DIR__ . '/../../../README.md'];

        $data = [
            'subject' => $subject,
            'now' => $now,
            'attach' => $attach,
        ];
        Mail::send(new SampleMail($data));
    }
}

メール送信クラスの編集

メール送信クラスを編集する。パスは以下。

[プロジェクトを生成したディレクトリ]/sandbox/app/Mail/SampleMail.php 

toの部分は実際に確認するアドレス(実在するメールアドレス)を入れる。

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class SampleMail extends Mailable
{
    use Queueable, SerializesModels;

    // メンバ変数を追加
    protected $data;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($data)
    {
        // コンストラクタで引数をメンバ変数へセットする
        $this->data = $data;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        // メール送信先
        $to = 'mail_to@example.com';
        // メール送信元
        $from = 'mail_from@example.com';
        // メール送信元の名称
        $fromName = 'Mail From Name';
        // CCの送信先
        //$cc = 'cc@example.com';
        // BCCの送信先
        //$bcc = 'bcc@example.com';
        // 返信先
        //$replyTo = 'reply_to@example.com';

        // メール送信情報のセット
        // メールテンプレート名はsample_mail
        $this->to($to)
            ->from($from, $fromName)
            //->cc($cc, $name = null)
            //->bcc($bcc, $name = null)
            //->replyTo($replyTo, $name = null)
            ->subject($this->data['subject'])
            ->text('mail.sample_mail')
            ->with('data', $this->data);

        foreach ($this->data['attach'] as $path) {
            $this->attach($path);
        }

        return $this;
    }
}

メールテンプレートの作成

メールテンプレートを作成する。

メール送信側で指定するメールテンプレートのパスはviewからのパスとなる。

今回SampleMailクラス内で指定しているテンプレートは mail.sample_mail なので実際のディレクトリは以下。

新規の場合はディレクトリがないのでmailディレクトリを作成後にテンプレートファイルを作成する。

[プロジェクトを生成したディレクトリ]/sandbox/resources/views/mail/sample_mail.blade.php

メールテンプレートの内容は以下のように作成。

実行日時は{{ $data['now'] }}です。

メール送信の実行

実際に実行してみる。これでメールが届けばOK。

$ php artisan batch:send-sample-mail

コメント

タイトルとURLをコピーしました