RitoLabo

LaravelとAWS SESを使ってAPIメール送信を行う(Mailableクラス&SimpleEmailService)

  • 公開:
  • カテゴリ: PHP Laravel
  • タグ: PHP,Laravel,AWS,composer,artisan,5.5,5.4,5.3,Mail,Mailgun,AmazonSES,Mailable,API

LaravelなどのPHPフレームワークには、簡単にメール送信を行える機能が備わっています。

Laravelの場合はsmtpやsendmailはもちろんのこと、 APIベースで送信を行うドライバも Amazon SES・mailgun・mandrill・sparkpostと揃っています。

今回は、AWSのSES(SimpleEmailService)を使ったメール送信を行います。

アジェンダ
  1. 開発環境
  2. ライブラリ導入
    1. Guzzle HTTPライブラリ
    2. Amazon AWS SDK for PHP
  3. ドライバをSESへ切り替える
  4. メールテンプレート作成
  5. mailableクラス作成
    1. mailableクラス生成
    2. mailableクラス実装
  6. メール画面プレビュー
  7. 動作確認

開発環境

今回の環境については以下の通りです。

  • Linux CentOS 7
  • Apache 2.4
  • PHP 7.1
  • Laravel 5.5

Laravelのバージョンに関しては、5.5、5.4、5.3であれば同一手順で進めていけます。

Laravelのルートディレクトリを「laravel/」としています。

また、Amazon SESでのメール送信を行いますので、最低限のセットアップは済んでいる前提で進めます。まだの場合は
AWS SESでのメール送信環境を構築する(Amazon Simple Email Service)
を参考にセットアップを行ってください。

そして、Amazon SESのAPI送信を扱えるIAMユーザを1つ用意しておいてください。

ライブラリ導入

まず初めに、LaravelでSESを使う為に必要な2つのライブラリを導入していきます。

Guzzle HTTPライブラリ

LravelでAPIベースドライバを使う場合は、Guzzle HTTPライブラリを導入する必要があります。

Laravelルートディレクトリへ移動し、以下のcomposerコマンドを叩きます。

# Laravelルートディレクトリへ移動する
cd /path/to/laravel

# Guzzle HTTPライブラリを導入する
composer require guzzlehttp/guzzle

# 実行結果
[demo@localhost laravel]# composer require guzzlehttp/guzzle
Using version
^6.3 for guzzlehttp/guzzle
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 4 installs, 0 updates, 0 removals

- Installing
guzzlehttp/promises (v1.3.1): Downloading (100%)
- Installing
psr/http-message (1.0.1): Downloading (100%)
- Installing
guzzlehttp/psr7 (1.4.2): Downloading (100%)
- Installing
guzzlehttp/guzzle (6.3.0): Downloading (100%)
Writing lock file
Generating optimized autoload files

> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Package manifest generated successfully.

laravel/composer.json を開いて、requireセクションを確認します。

"require": {
"php": ">=7.0.0",
"doctrine/dbal": "^2.6",
"fideloper/proxy": "~3.3",
"guzzlehttp/guzzle": "^6.3", // ← ココ
"laravel/framework": "5.5.*",
"laravel/tinker": "~1.0"
},

Guzzle HTTPライブラリがインストールされました。

Amazon AWS SDK for PHP

Amazon SESドライバを使用するにはAmazon AWS SDK for PHPを導入する必要があります。こちらは、composerでインストールします。

laravel/composer.jsonrequireセクションに以下を追記します。

"require": {
"php": ">=7.0.0",
"doctrine/dbal": "^2.6",
"fideloper/proxy": "~3.3",
"guzzlehttp/guzzle": "^6.3",
"laravel/framework": "5.5.*",
"laravel/tinker": "~1.0",
"aws/aws-sdk-php": "~3.0" // ← ココ
},

Laravelルートディレクトリへ移動し、以下のcomposerコマンドを叩きます。

# Laravelルートディレクトリへ移動する
cd /path/to/laravel

# composerコマンドでAmazon AWS SDK for PHPを導入する
composer update

# 実行結果
[demo@localhost laravel]# composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 2 installs, 0 updates, 0 removals

- Installing
mtdowling/jmespath.php (2.4.0): Downloading (100%)
- Installing
aws/aws-sdk-php (3.52.2): Downloading (100%)
aws/aws-sdk-php suggests installing aws/aws-php-sns-message-validator (To validate incoming SNS notifications)
Writing lock file
Generating optimized autoload files

> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Package manifest generated successfully.

ドライバをSESへ切り替える

LaravelのメールドライバをSESへ切り替えていきます。

envファイルに以下の設定項目を定義します。

laravel/.env
MAIL_DRIVER=ses
MAIL_FROM_ADDRESS=mail@code-tech.work
MAIL_FROM_NAME=Laravel

SES_KEY=HX69GJLNLK2PZEZFWRNX
SES_SECRET=dBnZhdWpeZjbubEyGRK6XT4pFTQYdZtjzTaydTsH
SES_REGION=us-east-1

services設定ファイルのSES部分を以下に変更します。

config/services.php
'ses' => [
'key' => env('SES_KEY'),
'secret' => env('SES_SECRET'),
'region' => env('SES_REGION'),
],

メールテンプレート作成

メールテンプレートを作成します。今回はHTMLメールと平文メール両方を用意しますので、以下のような階層でディレクトリを作成し、それぞれbladeファイルを作成します。

laravel
├─ resources
│   ├─ views
│   │   ├─
mail
│   │   │   ├─
html
│   │   │   │   └─
sesmail.blade.php
│   │   │   └─
plain
│   │   │   └─
sesmail.blade.php

laravel/resources/views 配下に mail/(html|plain)ディレクトリを作成し、それぞれsesmail.bale.php を作成します。

作成した2つのBladeテンプレートファイルは、それぞれ以下のように記述します。

laravel/resources/views/mail/html/sesmail.bale.php
<!DOCTYPE html>
<html lang="ja">
<style>
body {
background-color: #2a88bd;
color: #FFFFFF;
}
h1 {
font-size: 16px;
color: #ff6666;
}
</style>
<body>
<h1>
Sample Notification from Amazon SES
</h1>
<p>
Laravel & Amazon SES からメールが送信されました。
</p>
<p>
<a href="https://www.ritolab.com">https://www.ritolab.com</a>
</p>
</body>
</html>
laravel/resources/views/mail/plain/sesmail.bale.php
Sample Notification from Amazon SES

Laravel & Amazon SES からメールが送信されました。

https://www.ritolab.com

mailableクラス作成

Laravelでのメール送信クラスであるmailableクラスを作成していきます。

mailableクラス生成

まずはmailableクラスを生成します。Laravelルートディレクトリへ移動し、以下のartisanコマンドを叩きます。

# Laravelルートディレクトリへ移動する
cd /path/to/laravel

# artisanコマンドでmailableクラスを生成する
php artisan make:mail SampleSesMailable

# 実行結果
[demo@localhost laravel]# php artisan make:mail SampleSesMailable
Mail created successfully.

laravel/app/Mail 配下に SampleSesMailable.php が生成されます。

laravel
app
│ ├─ Mail
└─ SampleSesMailable.php
laravel/app/Mail/SampleSesMailable.php
<?php

namespace App\Mail;

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

class SampleSesMailable 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->view('view.name');
}
}

mailableクラス実装

それでは生成したmailableクラスを実装していきます。以下のようになります。

laravel/app/Mail/SampleSesMailable.php
<?php

namespace App\Mail;

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

class SampleSesMailable extends Mailable
{
use Queueable, SerializesModels;

protected $title;

/**
* Create a new message instance.
*
* @return void
*/
public function __construct()
{
$this->title = 'Amazon SESからのメール送信テストです。';
}

/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('mail.html.sesmail')
->text('mail.plain.sesmail')
->subject($this->title);
}
}

メール画面プレビュー

送信を行う前に、先ほど作ったテンプレートから、メール画面をプレビューしてみます。ルーティングを以下のように定義します。

laravel/routes/web.php
Route::get('sample/ses/preview', function () {
return new App\Mail\SampleSesMailable();
});

記述できたら、ブラウザから
http://YOUR-DOMAIN/sample/ses/preview
へアクセスしてみます。

メール画面プレビュー

HTMLメールではこんな感じで見えることになります。

動作確認

それでは実際にメールを送信してみます。

ルーティングに以下を追加します。

use Illuminate\Support\Facades\Mail;
use App\Mail\SampleSesMailable;

Route::get('sample/ses/send', function () {
$to = 'test@gmail.com';
Mail::to($to)->send(new SampleSesMailable());
});

記述できたら、ブラウザから
http://YOUR-DOMAIN/sample/ses/send
へアクセスします。

アクセスしたらメールを確認してみます。

htmlメール

問題なくメールが送信されました。

また、平文メールもこんな感じです。

平文メール

まとめ

以上で作業は完了となります。
Amazon SESはAPIメールの中でも特に優秀だと思います。セットアップも簡単で、無料送信分も個人で使うには十分です。特にAWSでWEBアプリケーションを運用している場合にはLaravelとSESの組み合わせはとてもおすすめです。

なにより、いちいちSMTPサーバを構築しなくても良いのがいいですね。最近は受信も行えるようになったAmazon SESにはこれからも注目です。是非試してみてください。