コンテンツにスキップ

OpenClawでGmailを自動連携:Pub/Sub設定とWebhook構築ガイド

大量に届くメールの中から重要な情報を抽出したり、特定のメールが届いた瞬間にアクションを起こしたりするのは、開発者にとって共通の悩みですよね。APIをポーリングし続けるのは非効率ですし、リアルタイム性を確保するためのインフラを整えるのは意外と骨が折れる作業です。

この記事では、Gmailの通知をPub/Sub経由で受け取り、OpenClawのWebhookへと繋げる効率的なパイプラインの構築方法を解説します。

作業を始める前に、以下のツールがインストールされ、設定が完了していることを確認してください。

  • gcloud がインストールされ、ログイン済みであること(インストールガイド)。
  • gog (gogcli) がインストールされ、Gmailアカウントの認証が完了していること(gogcli.sh)。
  • OpenClawのhooksが有効になっていること(Webhooksを参照)。
  • tailscale にログイン済みであること(tailscale.com)。このセットアップでは、パブリックなHTTPSエンドポイントとしてTailscale Funnelを使用します。 他のトンネルサービスも利用可能ですが、手動での設定が必要なためサポート対象外です。現時点ではTailscaleを推奨しています。

以下は、Gmailのプリセットマッピングを有効にするフック設定の例です。

{
hooks: {
enabled: true,
token: "OPENCLAW_HOOK_TOKEN",
path: "/hooks",
presets: ["gmail"],
},
}

Gmailの要約をチャット画面に配信したい場合は、プリセットをオーバーライドして、deliver とオプションの channel/to を設定するマッピングを追加します。

{
hooks: {
enabled: true,
token: "OPENCLAW_HOOK_TOKEN",
presets: ["gmail"],
mappings: [
{
match: { path: "gmail" },
action: "agent",
wakeMode: "now",
name: "Gmail",
sessionKey: "hook:gmail:{{messages[0].id}}",
messageTemplate: "New email from {{messages[0].from}}\nSubject: {{messages[0].subject}}\n{{messages[0].snippet}}\n{{messages[0].body}}",
model: "openai/gpt-5.2-mini",
deliver: true,
channel: "last",
// to: "+15551234567"
},
],
},
}

特定のチャンネルに固定したい場合は、channel と to を設定してください。設定しない場合、channel: "last" は最後に使用された配信ルート(デフォルトはWhatsApp)を使用します。

Gmailの処理に安価なモデルを強制したい場合は、マッピング内で model(provider/model またはエイリアス)を指定します。agents.defaults.models を設定している場合は、そのリストに含める必要があります。

Gmailフック専用のデフォルトモデルや思考レベル(thinking level)を設定するには、設定ファイルに hooks.gmail.model や hooks.gmail.thinking を追加します。

{
hooks: {
gmail: {
model: "openrouter/meta-llama/llama-3.3-70b-instruct:free",
thinking: "off",
},
},
}

注意点:

  • マッピング内の個別設定(model/thinking)は、これらのデフォルト設定よりも優先されます。
  • フォールバックの順序は次の通りです:hooks.gmail.model → agents.defaults.model.fallbacks → プライマリ(認証/レート制限/タイムアウト)。
  • agents.defaults.models が設定されている場合、Gmail用のモデルは許可リストに含まれている必要があります。
  • Gmailフックのコンテンツは、デフォルトで外部コンテンツの安全境界(safety boundaries)でラップされます。これを無効にする(危険を伴います)には、hooks.gmail.allowUnsafeExternalContent: true を設定してください。

ペイロードの処理をさらにカスタマイズしたい場合は、hooks.mappings を追加するか、hooks.transformsDir 配下にJS/TSの変換モジュールを作成してください(詳細は Webhooks を参照)。

OpenClawのヘルパーを使用して、すべてを一括で設定することをおすすめします(macOSではbrew経由で依存関係をインストールします)。

Terminal window
openclaw webhooks gmail setup \
--account openclaw@gmail.com

デフォルトの動作:

  • パブリックなプッシュエンドポイントとしてTailscale Funnelを使用します。
  • openclaw webhooks gmail run 用の hooks.gmail 設定を書き込みます。
  • Gmailフックのプリセットを有効にします(hooks.presets: ["gmail"])。

パスに関する注意:tailscale.mode が有効な場合、OpenClawは自動的に hooks.gmail.serve.path を / に設定し、パブリックパスを hooks.gmail.tailscale.path(デフォルトは /gmail-pubsub)に保持します。これは、Tailscaleがプロキシする前に設定されたパスプレフィックスを取り除くためです。 バックエンドでプレフィックス付きのパスを受け取る必要がある場合は、hooks.gmail.tailscale.target(または --tailscale-target)に http://127.0.0.1:8788/gmail-pubsub のようなフルURLを設定し、hooks.gmail.serve.path と一致させてください。

カスタムエンドポイントを使用したい場合は、--push-endpoint <url> を指定するか、--tailscale off を設定してください。

プラットフォームに関する注意:macOSではウィザードが gcloud, gogcli, tailscale をHomebrewでインストールしますが、Linuxでは事前に手動でインストールしておく必要があります。

Gatewayの自動起動(推奨):

  • hooks.enabled=true かつ hooks.gmail.account が設定されている場合、Gatewayは起動時に gog gmail watch serve を開始し、監視を自動更新します。
  • この機能を無効にするには、OPENCLAW_SKIP_GMAIL_WATCHER=1 を設定してください(自身でデーモンを実行する場合などに便利です)。
  • 手動でデーモンを実行している状態でこれを行うと、listen tcp 127.0.0.1:8788: bind: address already in use というエラーが発生するため、同時に実行しないでください。

手動デーモン(gog gmail watch serve の開始と自動更新):

Terminal window
openclaw webhooks gmail run
  1. gog で使用しているOAuthクライアントを所有するGCPプロジェクトを選択します。
Terminal window
gcloud auth login
gcloud config set project <project-id>

注意:Gmailの監視には、OAuthクライアントと同じプロジェクト内にPub/Subトピックが存在する必要があります。

  1. APIを有効にします:
Terminal window
gcloud services enable gmail.googleapis.com pubsub.googleapis.com
  1. トピックを作成します:
Terminal window
gcloud pubsub topics create gog-gmail-watch
  1. Gmailのプッシュ通知がパブリッシュできるように権限を付与します:
Terminal window
gcloud pubsub topics add-iam-policy-binding gog-gmail-watch \
--member=serviceAccount:gmail-api-push@system.gserviceaccount.com \
--role=roles/pubsub.publisher
Terminal window
gog gmail watch start \
--account openclaw@gmail.com \
--label INBOX \
--topic projects/<project-id>/topics/gog-gmail-watch

出力された history_id を保存しておいてください(デバッグ時に役立ちます)。

ローカルでの実行例(共有トークン認証):

Terminal window
gog gmail watch serve \
--account openclaw@gmail.com \
--bind 127.0.0.1 \
--port 8788 \
--path /gmail-pubsub \
--token <shared> \
--hook-url http://127.0.0.1:18789/hooks/gmail \
--hook-token OPENCLAW_HOOK_TOKEN \
--include-body \
--max-bytes 20000

注意点:

  • --token はプッシュエンドポイントを保護します(x-gog-token または ?token=)。
  • --hook-url はOpenClawの /hooks/gmail を指します。
  • --include-body と --max-bytes は、OpenClawに送信される本文のスニペットを制御します。

推奨事項:openclaw webhooks gmail run を使用すると、これらの一連の流れがラップされ、監視の自動更新も行われます。

ハンドラーの公開(高度・非サポート)

Section titled “ハンドラーの公開(高度・非サポート)”

Tailscale以外のトンネルが必要な場合は、手動で接続し、プッシュサブスクリプションでパブリックURLを使用してください(この方法はサポート外であり、ガードレールもありません)。

Terminal window
cloudflared tunnel --url http://127.0.0.1:8788 --no-autoupdate

生成されたURLをプッシュエンドポイントとして使用します:

Terminal window
gcloud pubsub subscriptions create gog-gmail-watch-push \
--topic gog-gmail-watch \
--push-endpoint "https://<public-url>/gmail-pubsub?token=<shared>"

本番環境では、安定したHTTPSエンドポイントを使用し、Pub/Sub OIDC JWTを設定した上で、以下を実行してください:

Terminal window
gog gmail watch serve --verify-oidc --oidc-email <svc@...>

監視対象のインボックスにメッセージを送信してみましょう:

Terminal window
gog gmail send \
--account openclaw@gmail.com \
--to openclaw@gmail.com \
--subject "watch test" \
--body "ping"

監視の状態と履歴を確認します:

Terminal window
gog gmail watch status --account openclaw@gmail.com
gog gmail history --account openclaw@gmail.com --since <historyId>
  • Invalid topicName: プロジェクトの不一致です。トピックがOAuthクライアントと同じプロジェクトにあるか確認してください。
  • User not authorized: トピックに roles/pubsub.publisher 権限が不足しています。
  • メッセージが空:Gmailのプッシュ通知は historyId のみを提供します。内容は gog gmail history 経由で取得されます。
Terminal window
gog gmail watch stop --account openclaw@gmail.com
gcloud pubsub subscriptions delete gog-gmail-watch-push
gcloud pubsub topics delete gog-gmail-watch

設定でお困りの際は、AI Setup Assistant を活用してください。

OpenClaw

OpenClaw Expert

まだ解決しませんか?

このページで解決しない場合は、OpenClaw Expertに直接質問してください。