0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Gmail POP3廃止対策】維持費0円 & AI監視で構築する「個人向け独自ドメインメールシステム」 (Cloudflare + Resend + Gemini)

Posted at

【Gmail POP3廃止対策】維持費0円 & AI監視で構築する「個人向け独自ドメインメールシステム」 (Cloudflare + Resend + Gemini)

はじめに

「2026年1月、Gmail の POP3 受信機能(他社メールの取り込み)が廃止される」

そんな話やセキュリティ要件の厳格化(OAuth2必須化など)による "Gmailへのメール集約" の難易度上昇に、独自ドメインメールを Gmail で一元管理していた私は仕組みの見直しを迫られました。
代替案として Google Workspace (有料) や 転送サービスの利用も考えましたが、「コストはかけたくない」「でもセキュリティ(DMARC/SPF/DKIM)は妥協したくない」というワガママな要件を満たす解がなかなか見つかりません。

そこで、「Gmail POP3受信に頼らない」「維持費0円」「サーバー管理不要」「AIによる全自動監視」 をテーマに、オリジナルのメールシステムを自作することにしました。

なお、本システムの構想から技術選定、アーキテクチャ設計、そして実際のコーディングに至るまで、その9割以上を Google の AI モデル「Gemini 3 Pro」とペアプログラミングで行いました。
私のざっくりとした要望を完璧なコードと構成に落とし込んでくれた Gemini は、本当に優秀なパートナーです。

システム構成 (Architecture)

VPS などのサーバーは一切使用せず、すべてマネージドサービスと API で構成しています。

概要図

技術選定とコスト

サービス 役割 コスト・選定理由
Cloudflare DNS & Routing 無料。ドメイン管理もここで行えば、卸売価格(.comで年間$9程度)で維持費最安です。
Resend SMTP Service 無料(1日100通まで)。APIフレンドリーで到達率が高く、SPF/DKIM設定も容易です。
Gmail Mail Client 無料。受信は「転送(Routing)」で行うため、POP3受信機能は不要です。送信は「エイリアス機能」に Resend の SMTP を設定して利用します。
GitHub Actions Automation 無料。監視スクリプトの定期実行基盤(Cron)。
Gemini 2.5 Flash-Lite AI Analysis 無料(Pay-as-you-go無料枠内)。
※Gemini 3.0 Flash も登場していますが、今回のタスク(要約・分類)には 2.5 Flash-Lite が機能・コストのバランスで最適 と判断し採用しました。
LINE Notify Notification 無料。緊急時の通知先。

かかっている費用は、ドメインの年間更新料(約1,500円/年)のみです。

こだわりポイント

1. DMARCレポートは「Gmailに転送しない」

通常、DMARCレポート(XMLファイル)はメールで届きますが、これをそのまま Gmail に転送すると受信トレイが XML ファイルで埋め尽くされてしまいます
また、添付ファイルの解析を毎回メールから行うのは非効率です。

そこで、DMARCレポート宛のメールだけは Cloudflare Worker 経由で直接 R2 (オブジェクトストレージ) に保存 する構成にしました。
これにより、Gmail を汚すことなく、Python スクリプトからは R2 の API でスマートにデータへアクセスできます。

2. AI (Gemini) によるリスク判定

DMARCレポートを毎日自動解析させますが、単純に「認証失敗 (Fail) = 危険」とすると、海外からのスパム試行のたびに通知が来てオオカミ少年化します。

そこで、「正規サーバーの設定ミスは High Risk」「外部からの攻撃遮断は Low Risk」 と AI に判断させています。

実際のコード(抜粋)

Gemini に状況を説明し、セキュリティエンジニアとして判断させています。
Flash-Liteは英語のプロンプトに引きずられて英語で回答してしまうため、なるべくプロンプトは日本語にしています。

# dmarc_r2_analyzer.py (抜粋)

def analyze_ip_risk(gemini, ip, whois, org_name, spf_res, dkim_res):
    # 正規サーバー以外は防御成功(LOW)、正規サーバーの失敗は設定ミス(HIGH)と定義
    prompt = (
        f"あなたはセキュリティ管理者です。\n"
        f"【前提条件】\n"
        f"1. 正規送信元は『Google (Gmail)』と『Amazon (Resend)』のみです。\n"
        f"2. 上記以外のIPからのFailは、外部攻撃をDMARCでブロックした事例です。"
        f"管理者対応は不要なため、危険度は『LOW』としてください。\n"
        f"3. 逆に、正規送信元(Google/Amazon)でのFailは、メール不達事故の可能性があるため、"
        f"危険度は『HIGH』としてください。\n"
        # ...(中略)...
    )
    
    # コスト最適化のため Gemini 2.5 Flash-Lite を使用
    return gemini.ask(prompt)

このロジックにより、「本当に対応が必要な時だけ LINE が鳴る」 静かな運用を実現しました。

3. JSONモードの強制

Gemini はおしゃべりなので、システム連携しやすいように JSON だけを返すように厳格に指示 しています。

# utils.py (GeminiClientクラス抜粋)

def ask_json(self, prompt):
    # 最新の Gemini 3.0 ではなく、あえて軽量な 2.5 Flash-Lite を指定
    model = genai.GenerativeModel("gemini-2.5-flash-lite")
    
    # JSON出力を強制するプロンプト
    prompt_for_model = (
        f"{prompt}\n\n"
        f"【注意】回答は必ず【回答JSONフォーマット】のJSON配列のみとし、"
        f"それ以外の説明や文章は一切含めないでください。"
    )
    
    response = model.generate_content(prompt_for_model)
    
    # 万が一Markdownなどが混ざっても正規表現でJSON部分だけ抽出する安全策
    match = re.search(r'(\[.+\])', response.text.strip(), re.DOTALL)
    if match:
        return json.loads(match.group(1))
    return json.loads(response.text)

インフラ管理 (IaC)

DNSレコードやR2バケット、Workerの設定などはすべて Terraform でコード化しています。
「手動でDNSをいじってメールが止まる」という事故を防ぎ、いつでも設定を復元できるようにしています。

# main.tf (抜粋)
resource "cloudflare_email_routing_rule" "dmarc_routing" {
  name    = "dmarc_to_worker"
  enabled = true 
  action {
    type    = "worker"
    value   = [cloudflare_worker_script.dmarc_saver.id] 
  }
  matcher {
    type    = "literal"
    field   = "to" 
    value   = "dmarc@example.com"  # ★ここを自身のドメインに合わせて変更
  }
}

まとめ

このシステムを運用し始めてから、「メールサーバーの管理」から完全に解放されました。

  • 維持費: 年間約1,500円(ドメイン代)のみ。
  • 信頼性: Cloudflare と Resend という強固なインフラ。
  • 安心感: Gemini が24時間体制でログを見て、LINEで教えてくれる。

Gmail POP3 受信廃止に備えたい方、エンジニアとしてこだわりのあるメール環境が欲しい方におすすめできる構成です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?