スポンサーリンク
はじめに
Heroku PHPにてメールを送信する時、mail関数、mb_send_mail関数が使えません。そのため、別の方法でメールを送信する必要があります。ここでは、代替手段の1つとして、SendGridを使用したメール送信方法を解説します。SendGridは、月12,000通まで無料でメールを送信できます(2019年3月時点)。
Add-onを追加
まず、メール送信機能を実装したいHerokuアプリのダッシュボードから、Resourcesを開きます。Add-onの検索窓に「SendGrid」と入力し、FreeのプランをProvisionします。
API Keyを取得
SendGridのコントロールパネルを開き、Settings→API Keysを開きます。そして、左上の「Create API Key」を押し、Full AccessのAPI Keyを作成します。API Keyは1度しか表示されませんので、正確にコピーしておきます。
次に、PHPプログラム上からAPI Keyを利用するため、Herokuの環境変数にAPI Keyを格納してしまいましょう。HerokuアプリのダッシュボードのSettingsのConfig Varsから、「SENDGRID_API_KEY」という項目を作成し、その値として先程取得したAPI Keyを設定します。
以上でHerokuでの準備は完了です。
composer.json composer.lockを準備
最初に、Composerがインストールされていることを確認してください。
既にcomposer.jsonが存在している場合、requireに
"sendgrid/sendgrid": "~7"
を追加してください。
composer.jsonが存在しない場合、composer.jsonを作成します。
こちらを参考にすると良いと思います。
composer initコマンドによりcomposer.jsonを作成し、
"require": {}
となっている部分を
"require": {
"sendgrid/sendgrid": "~7"
}
と書き換えます。
その状態でcomposer installを実行すると、composer.lockファイルが生成され、これでHerokuにSendGridのPHPライブラリを使用することを伝えることができます。
最新のバージョン情報はGitHubにて確認できます。
PHPプログラムを書く
GitHubにサンプルコードが書いてあるので、そちらを参考にして送信プログラムを書いていきます。
まずはシンプルなテキストメッセージの送信テストを行います。
<?php
require 'vendor/autoload.php';
$email = new SendGridMailMail();
$email->setFrom("test@example.com", "送信者A");
$email->setSubject("TestMail漢字");
$email->addTo("送信先メールアドレス", "受信者B");
$email->addContent("text/plain", "日本語 English");
$sendgrid = new SendGrid(getenv('SENDGRID_API_KEY'));
try {
$response = $sendgrid->send($email);
print $response->statusCode() . "n";
print_r($response->headers());
print $response->body() . "n";
} catch (Exception $e) {
echo 'Caught exception: '. $e->getMessage() ."n";
}
日本語が混じったメールでも、正常に文字化けせず送信できることを確認してください。
getenv('SENDGRID_API_KEY')は、先程Config Varsで設定したAPI Keyに自動的に置き換わります。漏洩に注意しましょう。
require 'vendor/autoload.php';は、設置するPHPプログラムの場所によって変化します。このサンプルでは、PHPプログラムがドキュメントルートに設置されることを想定しています。
上記のプログラムをアップロードして、実行します。正常に動作していれば、設定したメールアドレス宛に、以下のようなメールが届きます。Outlookでの表示例です。
正常に受信できましたか?
スポンサーリンク添付ファイルの添付方法
今回はテキストファイルを添付していきます。
流れとしては、
PHPでtmpディレクトリにテキストファイルを設置→ファイルをBase64エンコード→メールに添付
となります。
先程のaddContent行の下に、以下のコードを挿入して、テキストファイルを生成・添付してみます。
file_put_contents('/tmp/test.txt', 'テスト用テキストファイル'); //テキストファイルを生成
$email->addAttachment(new SendGridMailAttachment(base64_encode(file_get_contents('/tmp/test.txt')), "text/plain", "test.txt"));
Attachmentのコンストラクタは、Attachment($content, $type, $filename, $disposition, $content_id)となっています。
- $content:Base64エンコードされたコンテンツ(入力必須)
- $type:添付ファイルのMIMEタイプ(テキストファイルならtext/plain、PNG画像ファイルならimage/pngなど、適切に設定します。)
- $filename:受信したときのファイル名(入力必須)
- $disposition:添付ファイルがどのように表示されるか設定(inlineかattachmentを選択、デフォルトはattachment)
- $content_id:dispositionがinlineのとき、メールの本文中に画像ファイルを表示するためにファイルに割り当てるID
以上2行を正しく挿入した後、再度メール送信します。すると、
正常にテキストファイルが添付されました。同様の方法で、画像ファイルなども添付可能かと思います。
ご覧いただきありがとうございました。