【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 受信廃止に備えたい方、エンジニアとしてこだわりのあるメール環境が欲しい方におすすめできる構成です。