feat: complete ni-mail rewrite with Graph API, IMAP, OTP extractor, Web UI and Docker deployment

This commit is contained in:
juanjuanjuanidea
2026-07-24 13:57:34 +08:00
commit 015a63043d
17 changed files with 4265 additions and 0 deletions
+53
View File
@@ -0,0 +1,53 @@
from flask import Blueprint, jsonify, request
from app.models import Account
from app.services import graph, imap, verification
import os
bp = Blueprint("emails", __name__, url_prefix="/api/emails")
@bp.get("/")
def get_emails():
email = request.args.get("email")
if not email:
return jsonify({"error": "email query param required"}), 400
acct = Account.query.filter_by(email=email).first()
if not acct:
return jsonify({"error": "account not found"}), 404
proxy_url = os.getenv("PROXY_URL")
messages = []
if acct.method == "graph":
token_res = graph.get_access_token_graph_result(
client_id=acct.client_id,
refresh_token=acct.refresh_token,
proxy_url=proxy_url
)
if isinstance(token_res, dict) and "access_token" in token_res:
token = token_res["access_token"]
messages = graph.fetch_messages(token, top=15, proxy_url=proxy_url)
else:
# Fallback to IMAP
messages = imap.fetch_inbox_messages(
email=acct.email,
password=acct.password or acct.refresh_token,
limit=15,
proxy_url=proxy_url
)
results = []
for msg in messages:
body = msg.get("body", {}).get("content", "") or msg.get("body_text", "") or ""
code, link = verification.extract_code_and_link(body)
results.append({
"id": msg.get("id"),
"subject": msg.get("subject"),
"from": msg.get("from", {}).get("emailAddress", {}).get("address", ""),
"received_at": msg.get("receivedDateTime"),
"otp_code": code,
"link": link,
"body_preview": body[:300]
})
return jsonify(results)