feat(v1.1.0): add send mail support via Graph API and SMTP

This commit is contained in:
juanjuanjuanidea
2026-07-24 13:58:44 +08:00
parent 015a63043d
commit e5e1ef3a2d
4 changed files with 102 additions and 2 deletions
+50 -2
View File
@@ -1,6 +1,6 @@
from flask import Blueprint, jsonify, request
from app.models import Account
from app.services import graph, imap, verification
from app.services import graph, imap, smtp, verification
import os
bp = Blueprint("emails", __name__, url_prefix="/api/emails")
@@ -28,7 +28,6 @@ def get_emails():
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,
@@ -51,3 +50,52 @@ def get_emails():
})
return jsonify(results)
@bp.post("/send")
def send_email():
data = request.json or {}
email = data.get("email")
to_email = data.get("to_email")
subject = data.get("subject", "No Subject")
body = data.get("body", "")
if not email or not to_email:
return jsonify({"error": "email and to_email 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")
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"]
success = graph.send_mail_graph(token, to_email, subject, body, proxy_url=proxy_url)
if success:
return jsonify({"success": True, "message": "Email sent via Graph API"})
return jsonify({"error": "Graph API send mail failed"}), 500
return jsonify({"error": "Token refresh failed"}), 400
else:
try:
success = smtp.send_mail_smtp(
host=os.getenv("SMTP_HOST", "smtp.office365.com"),
port=int(os.getenv("SMTP_PORT", "587")),
username=acct.email,
password=acct.password or acct.refresh_token,
to_email=to_email,
subject=subject,
body_text=body,
use_tls=True
)
if success:
return jsonify({"success": True, "message": "Email sent via SMTP"})
except Exception as e:
return jsonify({"error": f"SMTP send mail failed: {str(e)}"}), 500
return jsonify({"error": "Send mail failed"}), 500