[Laravel] メール送信機能を作る

今回は,Gmailを使って,Laravelでメールを送信します.

.env にGmailの情報を登録する

MAIL_USERNAME や MAIL_FROM_NAME には送り元の正しい情報を入力してください.MAIL_PASSWORD にはGmailのアプリパスワードを入力します.

アプリパスワードの作り方は,「アプリパスワードの生成と利用方法」がていねいです.

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
→MAIL_HOST=smtp.gmail.com
MAIL_PORT=2525
→MAIL_PORT=587
MAIL_USERNAME=null
→MAIL_USERNAME=test@example.com
MAIL_PASSWORD=null
→MAIL_PASSWORD=application password
MAIL_ENCRYPTION=null
→MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=test@example.com
MAIL_FROM_NAME=test

メール作成画面をつくる

今回は,宛先,件名,本文の3つを送信できる画面を作ります.

Terminal

php artisan make:controller EmailController

routes\web.php

Route::get('email/create', 'EmailController@create');

EmailController.php

public function create()
{
    return view('emails.create');
}

emails\create.blade.php には,宛先と件名,本文に対応するinputを用意しておいてください.最低限これだけ書けば大丈夫です.

<form action="{{ url('email/send') }}" method="post">
    <div class="form-control">
        <input type="text" name="send_to" class="form-control">
        <input type="text" name="subject" class="form-control">
        <input type="text" name="content" class="form-control">
    </div>
    <button type="submit">送信</button>
</form>

Mailableクラスをつくる

Terminal

php artisan make:mail SampleEmail

app\Mail\SendEmail.php

    protected $subject;
    protected $content;

    public function __construct($subject, $content)
    {
        $this->subject = $subject;
        $this->content = $content;
    }

    public function build()
    {
        return $this->view('emails.html_mail')
            ->text('emails.text_mail')
            ->subject($this->subject)
            ->with([
                'content' => $this->content,
            ]);
    }

メールテンプレートをつくる

今回は,本文を表示するだけなので簡単です.

html_mail.blade.php と text_mail.blade.php をつくって,それぞれ

{{ $content }}

とだけ書けば,大丈夫です.

送信部分を実装する

web.php

Route::get('email/send', 'EmailController@send');

EmailController.php

public function send(Request $request)
{
    $subject = $request->input('subject');
    $content = $request->input('content');
    $sendTo = $request->input('send_to');

Mail::to($sendTo)->send(new SampleEmail($subject, $content));

return back()->with(‘success’, ‘メールを送信しました.’);
}

実装は以上です.

email/create にアクセスして,メールを送ってみましょう!無事送信されましたか?