最初の実用的な自動化として、今日届いたメールのうち重要そうなものだけをDiscordへ通知する処理を作りました。題材として選んだ理由は、入力、判定、出力が分かりやすく、結果を人がすぐ確認できるからです。
処理の流れ
実装は次の四段階です。
- IMAPへ読み取り専用で接続する
- 当日分のメールを取得する
- 件名、送信者、本文、優先度ヘッダーから点数を付ける
- しきい値以上のメールだけを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上で定期実行する方法と、スリープ中の注意点をまとめます。
