Posted at

[Laravel5]SendGridでメール送信する方法

More than 3 years have passed since last update.


SendgridのSMTPサーバ経由で送信する場合

LaravelでSendGridのSMTPサーバを使用してメールを送ることはとても簡単にできて、

ユーザ登録が完了していれば、公式HPにも乗っている通り以下のように設定するだけです。


config/mail.php

return array(

'driver' => 'smtp',
'host' => 'smtp.sendgrid.net',
'port' => 587,
'from' => array('address' => 'from@example.com', 'name' => 'John Smith'),
'encryption' => 'tls',
'username' => 'sendgrid_username',
'password' => 'sendgrid_password',
);

ユーザIDとパスワードでも可能ですが、API KEYを使用する場合以下のようにすればOKです。

    'username' => 'apikey',

'password' => 'YOUR_API_KEY',

非常に簡単です。

ちょっと使ってみる分にはこれで事足りるかと思います。


WebAPI経由で送信する場合

WebAPI経由での送信は以下の様な場合SMTPより有利と言われており、

Sendgridではメール送信時WebAPIを使用する事を推奨しています。

・ISPが全てのアウトバンドのメールポートをブロックしてHTTPのみ利用可能な場合

・Web APIはクライアント~サーバ間で多数のメッセージを必要としないため、アプリケーションサイトとSendGridの間で高いレイテンシーが確保できる場合、より高速になります。
・アプリケーションの動作環境を変更できず、SMTPライブラリのインストールおよび設定ができない場合
・メールを送信するライブラリを開発している場合。Web APIを利用した方が開発期間を短縮することができます。

また、エンコードはUTF-8固定のようです

SendGridでは公式ライブラリを始め、様々なWebAPIライブラリが公開されています。

https://sendgrid.kke.co.jp/docs/Integrate/libraries.html

例えば公式のやつはこんな感じになります。

$sendgrid = new SendGrid('YOUR_SENDGRID_APIKEY');

$email = new SendGrid\Email();
$email
->addTo('foo@bar.com')
->setFrom('me@bar.com')
->setSubject('Subject goes here')
->setText('Hello World!')
->setHtml('<strong>Hello World!</strong>');

$sendgrid->send($email);

やはりもう書いてある部分はそのままに、MailgunやMandrillのように、configでdriver変えて、API KEYとか設定するだけで使いたかったのですがどうにもうまい方法が見つかりませんでした。


laravel-sendgrid-driverを使う方法

というわけでdriverにSendgridを指定できるようにするPackageを作ってみました。

https://packagist.org/packages/s-ichikawa/laravel-sendgrid-driver

ReadMeにも書いた通り使い方はインストールして、いくつか設定を追加するだけです。

MAIL_DRIVER=sendgrid

SENDGRID_API_KEY='YOUR_SENDGRID_API_KEY'


config/services.php

'sendgrid' => [

'api_key' => env('SENDGRID_API_KEY')
]

後はLaravelのドキュメントに書いてある通り使えます。

既存のLaravelのクラス郡を継承しているのでMAIL_DRIVERの値をsmtpやlogにすればもちろんそのまま動きます。