ForcePilot/backend/package/yuxi/channel/extensions/email_smtp/attachment.py
Kris 59c6caaa64 feat(email-smtp): 新增SMTP/IMAP邮件渠道插件
实现完整的邮件收发渠道,支持IMAP IDLE实时收信、SMTP发信,包含附件校验、重复消息去重、OAuth2认证、邮件内容解析与引用剥离、邮件发送限流与连接池等功能
2026-05-21 10:45:56 +08:00

46 lines
1.1 KiB
Python

from __future__ import annotations
import os
ALLOWED_MIME_TYPES = {
"application/pdf",
"text/plain",
"text/csv",
"image/jpeg",
"image/png",
"image/gif",
"image/webp",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"application/msword",
"application/vnd.ms-excel",
}
BLOCKED_EXTENSIONS = {
".exe",
".dll",
".bat",
".cmd",
".ps1",
".vbs",
".js",
".scr",
".pif",
".msi",
".com",
}
MAX_TOTAL_SIZE = 25 * 1024 * 1024
MAX_PER_ATTACHMENT = 10 * 1024 * 1024
MAX_TEXT_FOR_AI = 200 * 1024
def is_attachment_safe(filename: str, content_type: str, size: int) -> tuple[bool, str]:
ext = os.path.splitext(filename)[1].lower()
if ext in BLOCKED_EXTENSIONS:
return False, f"禁止的文件类型: {ext}"
if size > MAX_PER_ATTACHMENT:
return False, f"附件过大 ({size} bytes > {MAX_PER_ATTACHMENT})"
if content_type not in ALLOWED_MIME_TYPES:
return False, f"不支持的 MIME 类型: {content_type}"
return True, "ok"