重要メールだけをDiscordへ—通知ノイズを減らす


最初の実用的な自動化として、今日届いたメールのうち重要そうなものだけをDiscordへ通知する処理を作りました。題材として選んだ理由は、入力、判定、出力が分かりやすく、結果を人がすぐ確認できるからです。

処理の流れ

実装は次の四段階です。

  1. IMAPへ読み取り専用で接続する
  2. 当日分のメールを取得する
  3. 件名、送信者、本文、優先度ヘッダーから点数を付ける
  4. しきい値以上のメールだけをDiscordへ投稿する

判定では、重要送信者、指定キーワード、urgentや「期限」「本日」といった表現、高優先度ヘッダーを加点しました。機械学習をいきなり使わず、理由を説明できるルールから始めています。

まずdry-runを作る

Discordへ送る前に、候補だけを表示する--dry-runを用意しました。

python email_to_discord.py --dry-run

ここで、本文全文を表示しない、HTMLメールをプレーンテキスト化する、文字化けしても処理全体を止めない、添付ファイルを勝手に開かない、といった挙動を確認します。

認証は通常パスワードを使わない

Gmailなどでは通常のログインパスワードではなく、必要に応じてアプリパスワードやOAuthを使います。例示する設定値は次のようにダミーへ置き換えます。

EMAIL_IMAP_HOST=imap.example.com
EMAIL_IMAP_USER=alerts@example.com
EMAIL_IMAP_PASSWORD=YOUR_APP_PASSWORD
DISCORD_BOT_TOKEN=YOUR_DISCORD_BOT_TOKEN

.envはバージョン管理から除外し、エラーログにも値を出しません。ブログには変数名だけを載せ、実値は決して掲載しません。

通知へ載せる情報を絞る

Discord通知には、件名、送信者の表示名、受信時刻、重要と判断した理由、短い要約だけを載せます。本文全体や添付ファイルを送ると、Discord側へ不要な個人情報を複製してしまいます。

また、同じメールを何度も送らない仕組みが必要です。Message-IDなどの安定した識別子を保存し、送信済みを除外します。今回は日次・短時間の試作から始めましたが、常時運用するなら重複排除は必須です。

再現チェック

  • [ ] メール接続は読み取り専用
  • [ ] --dry-runで候補と理由を確認できる
  • [ ] 通知本文に必要以上の個人情報を載せない
  • [ ] .envをGit管理しない
  • [ ] エラー時に認証情報をログへ出さない
  • [ ] 同じメールの二重通知を防ぐ

次回は、この処理をMac上で定期実行する方法と、スリープ中の注意点をまとめます。

参考にした一次情報


Back to top