📧
LaravelでサービスアカウントとGmail APIを利用してメールを送信する方法
はじめに
先日、Laravelでメールの送信処理を実装しました。サービスアカウントとGmail APIを使って実装したのですが、Gmail APIの使い方を把握するのに苦労したので基本的な使い方をまとめてみました。
前提
サービスアカウントの作成と鍵の追加までは完了している前提で話を進めます。鍵の追加時に作成されるJSONファイルは任意のディレクトリに保存してください。会社のメールアドレスをfromに設定する場合はドメイン全体の委任が必要になりますのでご注意ください。
全体像
全体像は以下の通りです。実際はもっと細かく変数・関数を使用してファイルも分割していますが、説明の都合で今回は省略して記載しています。
$client = new Client();
$client->useApplicationDefaultCredentials();
$client->setApplicationName(config('app.name'));
$client->setAuthConfig('JSONファイルの保存先のパス');
$client->setSubject('address-from@sample.com');
$client->setScopes([
Gmail::GMAIL_SEND,
]);
$gmail = new Gmail($client);
$displayName = mb_encode_mimeheader('表示名を記載する', "UTF-8");
$rawStringMessage = "From: $displayName <address-from@sample.com>\r\n";
$rawStringMessage .= "To: address-to-1@sample.com, to-2@sample.com\r\n";
$rawStringMessage .= "Cc: address-cc@sample.com\r\n";
$rawStringMessage .= "Bcc: address-bcc@sample.com\r\n";
$encodedSubject = mb_encode_mimeheader('件名を記載する', "UTF-8");
$rawStringMessage .= "Subject: $encodedSubject\r\n";
$rawStringMessage .= "Content-Type: text/plain; charset=utf-8\r\n";
$rawStringMessage .= "\r\n本文を記載する";
$message = new Message();
$rawMessage = base64_encode($rawStringMessage);
$message->setRaw($rawMessage);
$gmail->users_messages->send('address-from@sample.com', $message);
setAuthConfig
setAuthConfigには前提で配置したJSONファイルのパスを記載します。JSONファイルの内容を環境変数で管理するとよりメンテナンスがしやすくなって良いと思います。
$client->setAuthConfig('JSONファイルの保存先のパス');
setScopes
使用するスコープを指定します。今回はメールの送信のみなのでGmail::GMAIL_SEND
を指定していますが、アカウントの情報の読み取りなどが必要な場合は適宜こちらにスコープを追記してください。
$client->setScopes([
Gmail::GMAIL_SEND,
]);
from
メールのfromを設定しています。表示名に日本語を指定すると文字化けするので、UTF-8でエンコードしています。表示名が不要な場合は"From: address-from@sample.com\r\n"
でOKです。
$displayName = mb_encode_mimeheader('表示名を記載する', "UTF-8");
$rawStringMessage = "From: $displayName <address-from@sample.com>\r\n";
To, Cc, Bcc
送信先を指定します。複数の場合はメールアドレスを,
区切りで指定します。
$rawStringMessage .= "To: address-to-1@sample.com, to-2@sample.com\r\n";
$rawStringMessage .= "Cc: address-cc@sample.com\r\n";
$rawStringMessage .= "Bcc: address-bcc@sample.com\r\n";
Subject
メールの件名を指定します。fromと同様のため説明は割愛します。
$encodedSubject = mb_encode_mimeheader('件名を記載する', "UTF-8");
$rawStringMessage .= "Subject: $encodedSubject\r\n";
Content-Type
Content-Typeを指定します。text/plain;
, text/html;
などを指定します。
$rawStringMessage .= "Content-Type: text/plain; charset=utf-8\r\n";
Discussion