16
15

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 3 years have passed since last update.

Laravel+SendGrid WebAPIでメール送信

Posted at

#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社に感謝です。
アリガトウゴザイマス!

16
15
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
16
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?