Laravelでメールを送信する(SMTPにgmailを使用)

Laravel Laravel

サービスの開発していると、お問い合わせ内容をメールで受け取ったり、エラーの発生をメールで通知したいといった要望がでてくるのではないでしょうか。メール処理と聞くと難しそうだなと思う方も多いと思いますが、Laravelでは簡単に実装することが出来るのでその方法をまとめてみました。なお、自分でSMTPサーバーを設置・管理するのは一苦労なので、今回はgmailをSMTPサーバーとして利用しています。

Googleアカウントの「2段階認証プロセス」を有効にする

まず、外部のプログラムからgmailに接続するには「2段階認証プロセス」を有効にする必要があります。方法はGoogleの公式ページがあるのでこちらで確認してください。
https://support.google.com/accounts/answer/185839

Googleの「アプリ パスワード」を設定する

次に「アプリ パスワード」の設定(発行)を行ないます。こちらについてもGoogleの公式ページに説明があるので以下のURLを参考に作成してください。なお、私はあとで見ても分かりやすいように「アプリの選択ではその他(名前を入力)」を選んで「SMTP」という名称で作成しました。
https://support.google.com/accounts/answer/185833

上記の2つが正しく設定できていない場合は、メール送信時に以下のようなエラーが表示されます。

Failed to authenticate on SMTP server with username "{Googleアカウント}" using 3 possible authenticators. Authenticator LOGIN returned Expected response code 235 but got code "535", with message "535-5.7.8 Username and Password not accepted. Learn more at
 535 5.7.8 https://support.google.com/mail/?p=BadCredentials

コーディングをする

では、実際にコーディングを行っていきます。今回は以下の5ファイルを追加・編集して実装します。

sandbox
 ├ app
 │ └ Http
 │   └ Controllers
 │     └ mailController.php --- (1)
 ├ resources
 │ └ views
 │   ├ send.blade.php --- (2)
 │   └ mail.blade.php --- (3)
 ├ routes
 │ └ web.php --- (4)
 └ .env --- (5)

viewファイルの作成

まずはじめに、メールの送信処理を行なった後に表示する画面と、メールの送信内容を記載しておくviewファイルの設置を行います。

send.blade.php — (2)

メールの送信が完了した後に表示される内容を記述します。今回は静的な形で準備します。

<!DOCTYPE html>
<html lang="ja">
<head>
<title>メール送信完了画面</title>
</head>
<body>
メールの送信が完了しました。
</body>
<html>

mail.blade.php — (3)

送信するメールの内容を記述します。送信する内容については、後述するControllerで設定した内容が送られる形にします。

{{ text }}

Controllerファイルの作成

メールの送信処理を記述します。本来であれば関数化を行い再利用できるようにするのが望ましいですが、今回はよりシンプルに説明できるよう直接記述しています。なおHTMLメールとテキストメールで若干記載方法が異なりますのでご注意ください。

mailController.php — (1)

<?php
namespace App\Http\Controllers;

use Illuminate\Support\Facades\Mail;  // ファサードを読み込み

class mailController extends Controller
{
    public function send()
    {
        // メールに表示する内容を設定
        $data = array();
        $data['text'] = 'ここがメール本文です。'; // メール本文

        // 第1引数:メールの内容の表示に使うテンプレート(blade)
        // 第2引数:テンプレートファイルに渡すデータ(配列で渡す)
        // 第3引数:コールバック関数で送信先やタイトルの指定
        Mail::send(
            'mail',
            $data,
            function($message) {
                $message
                ->to('xxxxx@gmail.com')       // 送信先アドレス
                ->subject('メールが届きました'); // メールタイトル
            }
        );

        return view('send');
    }
}

なお「HTMLメール」ではなく「テキストメール」として送信したい場合は「Mail::send」の第1引数を以下のように記載します。それ以外は「HTMLメール」でも「テキストメール」でも同様です。

Mail::send('example',・・・・・);
 ↓
Mail::send(['text' => 'example'],・・・・・); 

設定ファイルの編集

.env — (5)

.envファイルに以下の記述があるので、gmailのSMTPを利用できるように内容を適切に変更します。

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
 ↓
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME={Googleアカウント}
MAIL_PASSWORD={アプリ パスワード}
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS={メールのfromに表示するアドレス}
MAIL_FROM_NAME={メールのfromに表示する名前}

web.php — (4)

<?php
Route::get('/mailsend', 'mailController@send');

動作確認

一通りの作業が完了したら「/mailsend」にアクセスしてみてください。正常に動作すれば「send.blade.php」に記述した内容が画面に表示され、メールが「mailController.php」で指定したアドレスに送信されている思います。

Laravelには今回のようなに簡単で便利な機能が多く準備されているので、適切に活用することでより開発効率を上げて行くことが可能です。

それではみなさん、自由なWEBライフをお過ごしください!

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