😽
Google App Engine と PHP 7/8 でメール送信
環境
- Google App Engine スタンダード環境
- PHP 7/8 (第2世代ランタイム)
記事作成の経緯
- 久々にGAEを使ってメールを送ろうとしたところ、既存のコードが動かずメールが送れなかったため備忘録として作成
- 基本的にGoogleのドキュメントにすべて書いてあるが、辿り着きにくいので作成
Google App Engineを使ったメール送信の概要
- 以下はバンドルサービスの概要 | Google Cloudのまとめ
- 昔の言語のバージョンを第1世代ランタイムと呼び、より新しい言語のバージョンを第2世代ランタイムと呼ぶ
- 第1世代ランタイム - Python 2、Java 8、Go 1.11、PHP 5.5
- 第2世代ランタイム - Python 3、Java 11、Go 1.12 以降、PHP 7/8 など
- 第1世代ランタイムではMail APIなどバンドルされていたが、第2世代ではバンドルされていないため、バンドルサービスAPIを呼び出す必要がある
アプリで以前の App Engine バンドル サービスにアクセスする方法
ポイント
app.yaml
以下を追記
app_engine_apis: true
composer.json
以下を追記
{
"require": {
"google/appengine-php-sdk": "^2.1" // Or any later version
}
}
PHPファイル
以下に変更
use Google\AppEngine\Api\Mail\Message;
第1世代ランタイムのバンドルAPIと似ているが、単語の頭が大文字になっているので注意
デプロイしないと動かない
ローカルでは動かない。ローカルで動かそうとすると、以下のようなエラーが出る。
PHP Fatal error: Uncaught GuzzleHttp\Exception\ConnectException: cURL error 6: Could not resolve host: appengine.googleapis.internal....
メールを送信できるユーザーを追加
新しくプロジェクトを作った場合に忘れがちなのでメモ
メールを送信できるユーザー | Google Cloud
おわりに
あとは第1世代ランタイムAPIと同様、以下のコードでメールが送れる。
use Google\AppEngine\Api\Mail\Message;
try {
$message = new Message();
$message->setSender('from@example.com');
$message->addTo('to@example.com');
$message->setSubject('Example email');
$message->setTextBody('Hello, world!');
$message->send();
echo 'Mail Sent';
} catch (InvalidArgumentException $e) {
echo 'There was an error';
}
Discussion