Help us understand the problem. What is going on with this article?

Laravel+SendGrid WebAPIでメール送信

1.はじめに

LaravelでSendGrid Web APIを使ってメール送信する方法を記載していきます!
メール本文はbladeで書いて、様々なメールのテンプレートを利用できるようにします。

2.環境

  • Laravel Framework 6.0.4
  • "sendgrid/sendgrid": "^7.4"

3.SendGridのコンソールで、API Keyを発行

SendGridにログイン(アカウントがない場合は作成)し、
https://app.sendgrid.com/settings/api_keysにアクセスします。

[Create API Key]をクリックし、APIキーを作成しましょう。

※APIキーは一度しか表示されないので注意!

4.パッケージのインストール

laravel側で、SendGridのパッケージをインストールしましょう。

terminal
composer require sendgrid/sendgrid

5.envファイルにAPIキーとかを追記

APIキーや送信元アドレスなどを記載しておきます。

.env
#sendgrid 
SENDGRID_API_KEY="ここにAPIキーを記載する"
FROM_EMAIL="ここに送信元アドレス"
FROM_NAME="ここに送信元の名前"

6.処理を書く

controllerやmodelなどにメール送信のコードを書きます。
今回はシンプルにRequestのデータからユーザのデータを取得してメール送信する例です。

※下記ではメール送信に失敗した際の処理をLogとして残していますが、要らない場合は削除してください。

use Exception;
use Log;

~

public function sendMail(Request $request)
    { 
        $data = $request->all();

        $email = new \SendGrid\Mail\Mail();
        $email->setFrom(getenv('FROM_EMAIL'), getenv('FROM_NAME'));
        $email->setSubject("○○○○○○○○○○○○通知");
        $email->addTo('送信先アドレス');

        $sendGrid = new \SendGrid(getenv('SENDGRID_API_KEY'));
        $email->addContent(
            "text/plain",
            strval(
                view(
                    'emails/templates/notificationMail',
                    compact('data')
                )
            )
        );
        $email->addContent(
            "text/html",
            strval(
                view(
                    'emails/templates/notificationMail',
                    compact('data')
                )
            )
        );
        try {
            $sendGrid->send($email);
            return true;
        } catch (Exception $e) {
            Log::debug($e->getMessage());
            return false;
        }
    }

7.メール本文をbladeで書く

6.のコードだと、「emails/templates/notificationMail.blade.php」をテンプレートとして指定しています。

viewをメールの体裁ごとに作成しておけば、便利だと思います。

通常のreturn viewと同様にcompactで渡したデータを好き放題表示しましょう!

notificationMail.blade.php
<div>
    <p>
        〇〇〇通知です<br>
        以下詳細をご確認ください
    </p>

    <div>
        <p>-------------------------------------------------------</p>
        <div>お名前{{ $data->name }}</div>
        <div>メッセージ{{ $data->message }}</div>
     <p>-------------------------------------------------------</p>
    </div>

</div>

8.宛先を複数人にしたいとき

宛先が複数人の場合は、「$email->addTo('送信先アドレス');」をforeach等で追加分実行すればできます。

同じアドレスが複数あるとBad Requestになってしまいメールが送れないので、配列にして重複を除いてから送信するとよいと思います!

example
$emails = array('test1@example.com', 'test2@example.com','test3@example.com');

$uniqueEmails = array_unique($emails);
$alignedUniqueEmails = array_values($uniqueEmails);

9.まとめ

あとは、メールを送信したいタイミングで関数を実行するだけです。
関数はどこかに汎用的に使えるようにしておくといいですね!

SendGrid社に感謝です。
アリガトウゴザイマス!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away