📧

LaravelでサービスアカウントとGmail APIを利用してメールを送信する方法

2024/10/05に公開

はじめに

先日、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