email-imap-fetch について
email-imap-fetchは、IMAPメールボックスを監視し、取得したメールの要約をOpenClawウェブフックに転送するスキルです。本文全体や添付ファイルの内容を送らず、構造化JSONLを使うメールルーティングに適しています。
主な機能
- 01IMAP IDLEまたはポーリング
- 02複数メールアカウント対応
- 03未読メールの取得
- 04OpenClawウェブフックへの転送
- 05JSONLの状態・メールイベント
- 06スニペットと添付メタデータのみ
活用シーン
- 01新着メールをOpenClawワークフローに送る
- 02複数アカウントから未読メールを取得
- 03デーモン管理下で常駐リスナーを実行
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ tiangong-ai/ agent-skills --skill email-imap-fetchインストール後、Claude Code で/email-imap-fetchを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamlassets/config.example.envreferences/env.mdscripts/imap_idle_fetch.py詳細
Email IMAP Fetch
主な目的
- IMAP IDLE を使って新着メールを待機します。
- 起動するたびに未読メッセージを取得します。
- env で設定した複数のメールボックスアカウントに対応します。
- 実行時の判定は行わず、env のモード(
idleまたはpoll)で IDLE のサポートを厳密に制御します。 - 取得した各メールを OpenClaw Webhook に転送します。
- 後続のステップで使える、機械可読な JSON 行を出力します。
- このスキルはステージ 1 のルーティングモードに厳密に限定します。スニペットと構造化参照のみを送信し、メッセージ本文全体や添付ファイルのバイナリデータ/内容は決して送信しません。
ワークフロー
- アカウントの env 変数と OpenClaw Webhook の env 変数を設定します(
references/env.mdとassets/config.example.envを参照)。 - 設定を検証します。
python3 scripts/imap_idle_fetch.py check-config
- アカウントごとに IDLE サイクルを 1 回実行します(スモークテスト)。
python3 scripts/imap_idle_fetch.py listen --cycles 1 --idle-seconds 120 --max-messages 10
- 継続して実行します(デフォルトの常駐モード)。
python3 scripts/imap_idle_fetch.py listen
ランタイムモデル
- スキルファイルはローカルにインストールされますが、リスナーは自動起動しません。
idleモードでは、リスナープロセスと IMAP 接続が稼働している間のみ、IMAP IDLE でプッシュイベントを受信します。pollモードでは、リスナーはポーリング間隔の間スリープし、その後、未読メッセージを取得します。- プロセスが終了するとプッシュイベントを受信できませんが、次回の実行時に
UNSEENで既存の未読メールを取得できます。 - デフォルトのランタイムは常駐モードです(デフォルトでは
IMAP_CYCLES=0)。 - デフォルトの IDLE モードは
pollです(IDLE をサポートしていないサーバーでも安全です)。 - 本番環境では、常時稼働のデプロイを
systemd、launchd、supervisor、または同等のデーモンマネージャーで実行してください。 - 対話型の exec セッションにひも付いたフォアグラウンドプロセスとしてリスナーを実行しないでください。そのセッションが終了すると、リスナーも停止します。
出力仕様
- 出力形式は JSONL です(1 行につき JSON オブジェクト 1 つ)。
- ライフサイクルイベントには
type=statusを使用します。 - 取得したメールには
type=messageを使用し、以下を含めます。account、mailbox、seq、uidsubject、from、to、datemessage_id_raw、message_id_norm(および互換性フィールドのmessage_id)snippet(プレーンテキストのプレビューのみ)attachment_count、attachment_manifest(要約のみ。添付ファイルの内容は含みません)mail_ref機械可読オブジェクト(account、mailbox、uid、message_id_raw、message_id_norm、date)
- Webhook メッセージには、確定的なディスパッチ抽出のため、以下の 2 つの固定された機械可読ブロックを含めます。
<<<MAIL_REF_JSON>>> ... <<<END_MAIL_REF_JSON>>><<<ATTACHMENT_MANIFEST_JSON>>> ... <<<END_ATTACHMENT_MANIFEST_JSON>>>
- サイクルのステータス出力において、
wait_modeはidleまたはpollです。 wait_eventsには、アクティブな待機方式の詳細を記録します。- OpenClaw Webhook の POST が成功すると、
event=webhook_deliveredのステータスイベントを出力します。 - アカウント単位のエラーには
type=errorを使用します。 - OpenClaw Webhook の POST が失敗すると、
event=webhook_failedのエラーイベントを出力します。
パラメーター
--cycles:アカウントごとの IDLE サイクル数(0は無制限)。--idle-seconds:各 IDLE 呼び出しの最大待機時間。--poll-seconds:ポーリングモードが有効な場合に使用する間隔。--idle-mode:idleまたはpoll。--max-messages:各サイクルで取得する未読メールの最大数。--mark-seen/--no-mark-seen:未読状態の更新を制御します。--snippet-chars:プレビューの文字数制限。--connect-timeout:接続タイムアウトの秒数。--retry-seconds:失敗後の再試行間隔。
環境変数のデフォルト値:
IMAP_CYCLESIMAP_IDLE_MODEIMAP_IDLE_SECONDSIMAP_POLL_SECONDSIMAP_MAX_MESSAGESIMAP_MARK_SEENIMAP_SNIPPET_CHARSIMAP_CONNECT_TIMEOUTIMAP_RETRY_SECONDS
OpenClaw Webhook 転送:
OPENCLAW_WEBHOOKS_ENABLEDOPENCLAW_WEBHOOKS_TOKENOPENCLAW_WEBHOOKS_BASE_URLOPENCLAW_WEBHOOKS_MODE(agentまたはwake)OPENCLAW_WEBHOOKS_ENDPOINT(任意のエンドポイント上書き)OPENCLAW_WEBHOOKS_PATHOPENCLAW_WEBHOOKS_WAKE_MODEOPENCLAW_WEBHOOKS_DELIVEROPENCLAW_WEBHOOKS_TIMEOUTOPENCLAW_WEBHOOKS_NAMEOPENCLAW_WEBHOOKS_AGENT_IDOPENCLAW_WEBHOOKS_CHANNELOPENCLAW_WEBHOOKS_TOOPENCLAW_WEBHOOKS_MODELOPENCLAW_WEBHOOKS_THINKINGOPENCLAW_WEBHOOKS_AGENT_TIMEOUT_SECONDSOPENCLAW_WEBHOOKS_SESSION_KEY_PREFIX
エラー処理
- 環境変数の設定が無効な場合、コード
2で終了します。 idleモードで IDLE がサポートされていない場合、明示的なエラーを返し、IMAP_IDLE_MODE=pollを提案します。- 実行時エラーは
type=errorとして出力されます。 - アカウントの処理中にエラーが発生した場合、コマンドはゼロ以外のコードで終了します。
参考資料
references/env.md
アセット
assets/config.example.env
スクリプト
scripts/imap_idle_fetch.py
コメント
Markdown 対応