13 KiB
Email Notification Forwarder (Discord / Agents Webhook)
メールサーバーを監視し、新しいメールをDiscordへ通知したり、AgentsのWebhookを通じてエージェントを起動したりするPythonアプリケーションです。Discordのみ、Agents Webhookのみ、または両方を同時に利用できます。
🚀 機能
- メールサーバー監視: IMAP/IMAPS プロトコルでメールサーバーを監視
- Discord通知: 新しいメールが到着したときにDiscordに通知
- Agents Webhook通知: メール内容をプロンプトとしてAgentsを起動
- 複数通知先: DiscordとAgents Webhookへの同時送信に対応
- 環境変数設定: 設定は全て環境変数で管理
- Dockerサポート: コンテナとして簡単にデプロイ可能
- SSL/TLS対応: セキュアな接続をサポート
- エラーハンドリング: 堅牢なエラー処理とログ出力
📋 必要な環境変数
| 変数名 | 説明 | 必須 | デフォルト値 |
|---|---|---|---|
EMAIL_USER |
メールアドレス | ✅ | - |
EMAIL_PASSWORD |
メールパスワード/アプリパスワード | ✅ | - |
DISCORD_WEBHOOK_URL |
Discord Webhook URL | 条件付き | - |
WEBHOOK_URL |
AgentsのWebhookエンドポイント | 条件付き | - |
WEBHOOK_TOKEN |
ユーザー単位で発行されたWebhookトークン | 条件付き | - |
DISCORD_CHANNEL_ID |
エージェントの応答先DiscordチャンネルID | 条件付き | - |
WEBHOOK_SOURCE |
Agents上で表示するサービス名 | ❌ | email-monitor |
IMAP_SERVER |
IMAPサーバーアドレス | ❌ | imap.gmail.com |
IMAP_PORT |
IMAPポート番号 | ❌ | 993 |
USE_SSL |
SSL/TLS使用の有無 | ❌ | true |
MAILBOX |
監視するメールボックス | ❌ | INBOX |
CHECK_INTERVAL |
チェック間隔(秒) | ❌ | 60 |
DISCORD_WEBHOOK_URL、またはAgents用の WEBHOOK_URL / WEBHOOK_TOKEN / DISCORD_CHANNEL_ID のいずれか一組が必要です。Agents用の3変数は必ずまとめて設定してください。
🔧 セットアップ
1. Discord Webhook URLの取得(Discordへ直接通知する場合)
- Discordでメッセージを送信したいチャンネルを選択
- チャンネル設定 → 連携サービス → ウェブフック
- 新しいウェブフックを作成してURLをコピー
2. Agents Webhookの設定(Agentsを起動する場合)
Agentsの会話コンテキストに表示される「Webhook エンドポイント(実行時情報)」に従い、現在のユーザー用トークンを取得します。サービスに渡すのは WEBHOOK_TOKEN だけです。マスター鍵である WEBHOOK_SECRET は絶対に設定しないでください。
WEBHOOK_URL=http://agents-host:8080/webhook
WEBHOOK_TOKEN=<user_id>:<hmac>
DISCORD_CHANNEL_ID=123456789012345678
WEBHOOK_SOURCE=email-monitor
メール受信時には、次の形式でAgentsへ送信します。
POST ${WEBHOOK_URL}
Authorization: Bearer ${WEBHOOK_TOKEN}
Content-Type: application/json
{
"source": "email-monitor",
"channel_id": 123456789012345678,
"prompt": "新しいメールを受信しました。..."
}
3. Gmail用アプリパスワードの作成(Gmailを使用する場合)
- Googleアカウントの2段階認証を有効にする
- Googleアカウント設定 → セキュリティ → アプリパスワード
- メール用のアプリパスワードを生成
4. 環境変数の設定
# .env.exampleをコピーして.envファイルを作成
cp .env.example .env
# .envファイルを編集して実際の値を設定
🚢 Agents container_tools へのデプロイ
container_tools はイメージをビルドせず、レジストリからpullして起動します。このリポジトリでは、main へのpush時にGitea Actionsが次のイメージをHarborへ公開します。
harbor.mukan.0am.jp/services/email-to-discord:<commit-sha>
harbor.mukan.0am.jp/services/email-to-discord:latest
1. Gitea Actions Secretsの設定
リポジトリのActions Secretsへ次の2項目を登録します。実際の値をリポジトリやComposeへコミットしないでください。
HARBOR_USERNAMEHARBOR_PASSWORD
Pull Requestではテストステージと実行イメージのビルドだけを行い、main へマージされたときだけHarborへpushします。
2. デプロイ用Composeの準備
通常の docker-compose.yml は container_tools 用テンプレートです。次の値を実際のデプロイ情報へ置き換えます。
- イメージタグの
latest(可能ならGitea Actionsが公開したコミットSHAへ変更) REPLACE_WITH_EMAIL_USERREPLACE_WITH_EMAIL_PASSWORDREPLACE_WITH_WEBHOOK_URLREPLACE_WITH_WEBHOOK_TOKENREPLACE_WITH_DISCORD_CHANNEL_ID
Discordへの直接通知も併用する場合だけ、空の DISCORD_WEBHOOK_URL に実際のURLを設定します。WEBHOOK_SECRET は設定しません。
Agentsの実行時情報にある WEBHOOK_URL が http://127.0.0.1:<port>/webhook の場合、コンテナ内の 127.0.0.1 はサテライト自身を指すため、http://host.docker.internal:<port>/webhook に置き換えてください。ComposeにはLinuxからDockerホストへ到達するための host-gateway を設定済みです。
3. デプロイ
置換後のCompose全文を、安定した project_name とともに container_tools へ渡します。デプロイ用Composeには、container_tools が禁止する build、container_name、env_file、host bind mountを含めていません。
🐳 ローカルDocker Composeでの実行
ローカルでソースからビルドする場合は、デプロイ用とは別の docker-compose.local.yml を使用します。
1. .env の設定
EMAIL_USER=your-email@gmail.com
EMAIL_PASSWORD=your-app-password
# Discordへ直接通知する場合
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/YOUR_WEBHOOK_URL
# Agentsを起動する場合(3項目すべてが必要)
WEBHOOK_URL=http://agents-host:8080/webhook
WEBHOOK_TOKEN=<user_id>:<hmac>
DISCORD_CHANNEL_ID=123456789012345678
2. コンテナの起動
# コンテナをビルドして起動
docker compose -f docker-compose.local.yml up --build -d
# ログの確認
docker compose -f docker-compose.local.yml logs -f
# コンテナの停止
docker compose -f docker-compose.local.yml down
🚀 Linux用シェルスクリプトでの実行
Linux環境では便利なシェルスクリプトを使用できます:
1. スクリプトに実行権限を付与
chmod +x start.sh
2. 初期セットアップ
# .envファイルを作成
./start.sh setup
# .envファイルを編集して実際の値を設定
nano .env
3. よく使用するコマンド
# Dockerイメージをビルド
./start.sh build
# コンテナを起動
./start.sh start
# リアルタイムでログを表示
./start.sh logs-f
# コンテナの状態を確認
./start.sh status
# コンテナを停止
./start.sh stop
# コンテナを再起動
./start.sh restart
# docker-compose で起動
./start.sh compose-up
# Python直接実行
./start.sh python
# ヘルプを表示
./start.sh help
4. 利用可能なコマンド一覧
| コマンド | 説明 |
|---|---|
setup |
初期セットアップ(.envファイル作成) |
build |
Dockerイメージをビルド |
start |
コンテナを起動 |
stop |
コンテナを停止 |
restart |
コンテナを再起動 |
logs |
ログを表示 |
logs-f |
ログをリアルタイム表示 |
status |
コンテナの状態を確認 |
clean |
停止済みコンテナとイメージを削除 |
compose-up |
docker-compose で起動 |
compose-down |
docker-compose で停止 |
python |
Python直接実行 |
help |
ヘルプを表示 |
🪟 Windows用PowerShellスクリプトでの実行
Windows環境では PowerShell スクリプトを使用できます:
1. 初期セットアップ
# .envファイルを作成
.\start.ps1 setup
# .envファイルを編集して実際の値を設定
notepad .env
2. よく使用するコマンド
# Dockerイメージをビルド
.\start.ps1 build
# コンテナを起動
.\start.ps1 start
# リアルタイムでログを表示
.\start.ps1 logs-f
# コンテナの状態を確認
.\start.ps1 status
# コンテナを停止
.\start.ps1 stop
# ヘルプを表示
.\start.ps1 help
🔨 Dockerでの直接実行
1. イメージのビルド
docker build -t email-to-discord .
2. コンテナの実行
docker run -d \
--name email-monitor \
--restart unless-stopped \
-e EMAIL_USER=your-email@gmail.com \
-e EMAIL_PASSWORD=your-app-password \
-e DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/YOUR_WEBHOOK_URL \
-e WEBHOOK_URL=http://agents-host:8080/webhook \
-e WEBHOOK_TOKEN=<user_id>:<hmac> \
-e DISCORD_CHANNEL_ID=123456789012345678 \
-e CHECK_INTERVAL=60 \
email-to-discord
🐍 Python直接実行
1. 依存関係のインストール
pip install -r requirements.txt
2. 環境変数の設定
# Windowsの場合
set EMAIL_USER=your-email@gmail.com
set EMAIL_PASSWORD=your-app-password
set DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/YOUR_WEBHOOK_URL
# Linux/macOSの場合
export EMAIL_USER=your-email@gmail.com
export EMAIL_PASSWORD=your-app-password
export DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/YOUR_WEBHOOK_URL
# Agents Webhookを使う場合
export WEBHOOK_URL=http://agents-host:8080/webhook
export WEBHOOK_TOKEN=<user_id>:<hmac>
export DISCORD_CHANNEL_ID=123456789012345678
3. アプリケーションの実行
python app.py
📧 対応メールプロバイダー
Gmail
IMAP_SERVER=imap.gmail.com
IMAP_PORT=993
USE_SSL=true
Outlook/Hotmail
IMAP_SERVER=outlook.office365.com
IMAP_PORT=993
USE_SSL=true
Yahoo Mail
IMAP_SERVER=imap.mail.yahoo.com
IMAP_PORT=993
USE_SSL=true
その他のプロバイダー
各プロバイダーのIMAP設定を確認して適切な値を設定してください。
📊 ログとモニタリング
アプリケーションは以下の情報をログ出力します:
- 起動/停止メッセージ
- メールサーバー接続状況
- 新しいメールの検出
- Discord・Agents Webhook送信の成功/失敗
- エラー情報
# Dockerコンテナのログを確認
docker logs email-to-discord-monitor
# リアルタイムでログを監視
docker logs -f email-to-discord-monitor
🔒 セキュリティ考慮事項
- アプリパスワードの使用: 通常のパスワードではなくアプリ専用パスワードを使用
- 環境変数での機密情報管理: パスワードやWebhook URLは環境変数で管理
- SSL/TLS接続: メールサーバーとの通信は暗号化
- 非rootユーザー: Dockerコンテナは非rootユーザーで実行
- ユーザー単位トークン: Agents連携には
WEBHOOK_SECRETではなくWEBHOOK_TOKENのみを使用
複数の通知先を設定した場合、すべての通知先への送信が成功してからメールを既読にします。いずれかが失敗したメールは未読のままとなり、次回の監視時に再試行されます。
🛠️ トラブルシューティング
メールサーバーに接続できない場合
- IMAP設定が正しいか確認
- アプリパスワードが正しく設定されているか確認
- 2段階認証が有効になっているか確認(Gmail)
- ファイアウォールの設定を確認
Discord通知が送信されない場合
- Webhook URLが正しいか確認
- Discordサーバーの権限を確認
- ネットワーク接続を確認
Agents Webhookが起動しない場合
WEBHOOK_URLが/webhookを含む正しいURLか確認WEBHOOK_TOKENが現在のユーザー用に発行された値か確認DISCORD_CHANNEL_IDが数値のチャンネルIDか確認- Agents側のWebhookエンドポイントへコンテナから接続できるか確認
ログの確認方法
# アプリケーションのログレベルを変更(開発時)
# app.py内のlogging.basicConfig levelをDEBUGに変更
📝 ライセンス
このプロジェクトはMITライセンスの下で公開されています。
🤝 コントリビューション
プルリクエストやイシューの報告を歓迎します。
📞 サポート
問題が発生した場合は、GitHubのIssueにて報告してください。