😽

Google App Engine と PHP 7/8 でメール送信

2022/12/01に公開

環境

  • 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 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