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

Laravelメール送信機能の実装でmailtrapやGmailのSMTPサーバーを使ってみる

More than 1 year has passed since last update.

内容

Webアプリケーションを制作するに当たり、メール送信機能が必要であることが多々あるかと思います。
今回はLaravel5.8の環境下で、mailtrapを使用と、GmailのSMTPを使用したメール送信の2つのパターンで機能実装をしてみたので、その実装過程を纏めて投稿します。

環境

macOS Mojave 10.14.6
Laravel Framework 5.8.33

1. SMTPサーバー

  • 仮想のSMTPテストサーバーmailtrapを使って簡易的に実装
    • 実際のメールアドレスを使用せず、mailtrapサイト上で内容等を確認できるため、送信機能のテストが簡易的に行える
    • 開発段階で適当に入力したメールアドレスが実際に存在しても送信されることはない
  • GmailのSMTPサーバーを使用して実装
    • 実際にメールが送信される

2. mailtrapを使用する場合の設定

2.1 mailtrapのアカウント作成

メールアドレスで新規登録もしくは、既存のGmailやgithubアカウントも使用できる。
https://mailtrap.io/register/signup?ref=header
スクリーンショット 2019-08-29 16.56.40.png

2.2 SMTPの情報をLaravelの設定に反映させる

2.2.1 設定値の確認

sign in したらdemo inboxを開く
スクリーンショット 2019-08-29 17.02.52.png

IntegrationよりLaravelを選択
スクリーンショット 2019-08-29 17.05.47.png

SMTP settingsの情報をenvもしくはconfig/mail.phpのどちらかに設定(念のため両方)
スクリーンショット 2019-08-29 17.06.59.png

2.2.2 実際に設定する

上記で確認したenvもしくはconfig/mail.phpの値をそれぞれのファイルの該当部にコピペする

.env
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=4b5fb1796bf652  // コピペの内容のままで良い
MAIL_PASSWORD=22c902aa6ac123  // コピペの内容のままで良い
MAIL_FROM_ADDRESS=hoge@gmail.com  // どのアドレスから送信するかを記載
MAIL_FROM_NAME=name  // 名前を適当に設定

上記内容をconfing/mail.phpでも同様に設定する

設定完了後は各種キャッシュクリア

$ php artisan cache:clear
$ php artisan config:cache

3. GmailのSMTPを使う場合の設定

GmailのSMTPを使用する場合はセキュリティの都合上、Gmailアカウントの設定変更が必要となる。

  • 安全性の低いアプリ許可をオンにする方法
  • 二段階認証を有効にし、アプリパスワードを発行する方法

3.1 安全性の低いアプリ許可をオンにする方法

  • 安全性の低いアプリの許可をオンにする
    • https://myaccount.google.com/lesssecureapps
    • こちらは、二段階認証を有効にしている場合はオンにできない仕様である。すでに2段階認証が有効にされている場合は設定を解除しても良いが、下記、二段階認証有効下でアプリパスワードを発行する方法をオススメする
  • .envファイルを下記の通り設定する
.env
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=hoge@example.com  // メールアドレスを記載(下のFROMと同じで良い)
MAIL_PASSWORD=hogehogehoge  // Gmailアカウントの生のパスワード
MAIL_FROM_ADDRESS=hoge@example.com  // どのアドレスから送信するかを記載
MAIL_FROM_NAME=name  // 名前を適当に設定

上記内容をconfing/mail.phpでも同様に設定する

設定完了後は各種キャッシュクリア

$ php artisan cache:clear
$ php artisan config:cache

3.2 二段階認証を有効にし、アプリパスワードを発行する方法

  • 二段階認証の有効化
  • アプリパスワードの発行
    • 簡単に言うとenvファイルで設定するMAIL_PASSWORDに記載するパスワードを発行すること
    • ログインしたアカウントのGoogleアカウントページのセキュリティよりアプリパスワードを設定する。
      • アプリを選択では「メール」を選択する
      • デバイスを選択では使用しているデバイスを選択する
    • 設定が終わると16桁のアプリパスワードが発行されるため、それをenvファイルのMAIL_PASSWORDに記載
    • 注)デプロイするアプリケーションごとに発行する必要があり、使い回しだと認証が通らないので注意。(localで使用したものをデプロイ先で使えない)

スクリーンショット 2019-08-29 18.38.27.png

envの設定値は、「安全性の低いアプリ許可をオンにする方法」の場合と比較し、MAIL_PASSWORDの内容が異なる

.env
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587   // 587にする
MAIL_USERNAME=hoge@example.com  // メールアドレスを記載(下のFROMと同じで良い)
MAIL_PASSWORD=hogehogehoge  // 発行したアプリパスワードの設定
MAIL_FROM_ADDRESS=hoge@example.com  // どのアドレスから送信するかを記載
MAIL_FROM_NAME=name  // 名前を適当に設定

上記内容をconfing/mail.phpでも同様に設定する

設定完了後は各種キャッシュクリア

$ php artisan cache:clear
$ php artisan config:cache

4. Mailableクラス

設定値の入力が完了すれば、次は機能面の実装
Mailableクラスでは送信するメールの情報やその内容を設定できる

4.1 Mailableクラスの作成

次のコマンドを実行すると、app/Mail/SamleMail.phpを生成される
今回はクラス名をSampleMailとする

$ php artisan make:mail {クラス名}
# 今回、作成するクラス名
$ php artisan make:mail SampleMail
  • 生成されたapp/Mail/SampleMailbuild()メソッドに送信するメールの送信元情報や、メールの内容を追記する
  • メールの送信元や、メールの内容で状況に応じて変数を使用したい場合があるが、変数を使用する場合としない場合と2通り説明する

4.2 変数を使用せず、決まった送信元から決まった内容を送信する場合

app/Mail/SamleMail.php
<?php

namespace App\Mail;

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

class SampleMail extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
      return $this
          ->from('hoge@sample.com') // 送信元
          ->subject('テスト送信') // メールタイトル
          ->view('mail.send'); // メール本文のテンプレートとなるviewを設定
    }
}

4.3 変数を受け取る場合

今回、下記の例では次の変数$contentをControllerから受け取ることとする
$content = ['name' => 'fuga', 'mail' => 'fuga@example.com'];
※Controller側の設定は次項で説明

app/Mail/SamleMail.php
<?php

namespace App\Mail;

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

class SampleMail extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */

    // 引数で受け取る変数
    protected $content;
    // コンストラクタ設定
    public function __construct($content)
    {
        // 引数で受け取ったデータを変数にセット
        $this->content = $content;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
      return $this
          ->from('hoge@exapmle.com') // 送信元
          ->subject('テスト送信') // メールタイトル
          ->view('mail.send') // メール本文のテンプレート
          ->with(['content' => $this->content]);  // withでセットしたデータをviewへ渡す
    }
}

5. Controllerの設定

Controller側では送信先とMailableクラスの振り分けを行う

Controller
use App\Mail\OrderMail;
use Illuminate\Support\Facades\Mail;

public function store(Request $request){
  // フォームからのリクエストデータ全てを$contentに代入
  $content = $request->all();

// 特に変数を渡さない場合
Mail::to($content->email)->send(new SapmleMail);
// データの入った変数を渡す場合
Mail::to($content->email)->send(new SampleMail($content));

6. メール本文のテンプレート

Mailableクラスで設定したviewのメール本文のテンプレートの作成

views/mail/send.blade.php
// withで変数を受け取った場合は変数を使用できる
{{ $contact->name }} 
メール送信完了

7. メールの送信

以上で、メール送信機能が完成。
mailtrapではこのような感じでで表示されるようになる。

スクリーンショット 2019-08-29 17.09.39.png

KZ-taran
最近はReactばっかり触ってる。webGLも。Railsも。 あとLaravel, Vue少し。
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした