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)を使ったメール送信を行います。
- アジェンダ
開発環境
今回の環境については以下の通りです。
- 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.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",
"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=YOURSESKEY
SES_SECRET=YOURSESSECRET
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
│ │ │ ├─ 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
│ │ └─ 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
へアクセスします。
アクセスしたらメールを確認してみます。
問題なくメールが送信されました。
また、平文メールもこんな感じです。
まとめ
以上で作業は完了となります。
Amazon SESはAPIメールの中でも特に優秀だと思います。セットアップも簡単で、無料送信分も個人で使うには十分です。特にAWSでWEBアプリケーションを運用している場合にはLaravelとSESの組み合わせはとてもおすすめです。
なにより、いちいちSMTPサーバを構築しなくても良いのがいいですね。最近は受信も行えるようになったAmazon SESにはこれからも注目です。是非試してみてください。