• 简体中文
  • 数据库结构 / Database Schema

    MailPort 共三张表( MongoDB 中为三个集合)。应用首次启动时自动创建,无需手动执行 SQL。

    字段命名在各数据库中保持一致;下文以关系型数据库的蛇形命名为准。

    senders — 发件商

    每条记录是一个独立的发件通道,拥有独立的调用端点、密钥与收件域名白名单。

    字段类型说明
    idTEXT / VARCHAR(64)主键,UUID
    pidTEXT,唯一路由标识。创建时随机生成的 5–10 位字母数字,用于拼接发件接口路径 /api/{pid}/send
    nameTEXT显示名称,仅用于后台识别
    typeTEXT发件方式:smtp(账号密码)、http(HTTP API 转发)、outlook_oauth2、gmail_oauth2
    enabledBOOLEAN是否启用。禁用后接口返回 404
    hostTEXT,可空SMTP 主机。设置 service 时为空
    portINT,可空SMTP 端口,通常 465 / 587
    secureBOOLEAN是否使用 SSL/TLS
    serviceTEXT,可空nodemailer 预置服务名,如 QQ、Gmail。设置后忽略 host/port。所有支持的运营商
    usernameTEXT,可空SMTP 登录账号;OAuth 类型下为授权的邮箱地址
    passwordTEXT,可空SMTP 密码。AES-256-GCM 加密存储,读取时自动解密
    from_addressTEXT,可空发件人地址,为空时用 username
    from_nameTEXT,可空发件人显示名
    allowed_domainsJSON / JSONB允许的收件域名数组。空数组 [] 表示不限制
    http_urlTEXT,可空http 类型的请求地址
    http_methodTEXT,可空http 类型的请求方法,默认 POST
    http_headersTEXT,可空http 类型的自定义请求头,标准 JSON 对象文本
    http_bodyTEXT,可空http 类型的自定义请求体模板,支持 {{to}} 等占位符
    oauth_client_idTEXT,可空OAuth 应用 Client ID
    oauth_client_secretTEXT,可空OAuth 应用 Client Secret。AES-256-GCM 加密存储
    oauth_refresh_tokenTEXT,可空OAuth 刷新令牌。AES-256-GCM 加密存储
    oauth_authorized_atBIGINT,可空完成 OAuth 授权的时间戳(毫秒),未授权为空
    created_atBIGINT创建时间戳(毫秒)
    updated_atBIGINT更新时间戳(毫秒)

    索引:pid 唯一索引。

    升级说明:v0.1.0 之后新增的 8 列(http_* / oauth_*)由应用启动时自动补齐,老库无需手动迁移。

    sender_keys — 发件商密钥

    一个发件商可持有多个 32 位密钥,各自可启停、删除。

    字段类型说明
    idTEXT / VARCHAR(64)主键,UUID
    sender_idTEXT所属发件商 id,外键级联删除
    keyTEXT32 位随机密钥。AES-256-GCM 加密存储,后台可解密重复查看
    labelTEXT备注名,用于区分调用方
    enabledBOOLEAN是否启用。禁用后使用该密钥的请求返回 401
    last_used_atBIGINT,可空最近一次成功调用的时间戳(毫秒)
    created_atBIGINT创建时间戳(毫秒)

    索引:sender_id 索引。

    send_logs — 发送日志

    每次调用接口(无论成败)都会写入一条。

    字段类型说明
    idTEXT / VARCHAR(64)主键,UUID
    sender_idTEXT所属发件商 id,外键级联删除
    key_idTEXT,可空使用的密钥 id
    to_addrTEXT收件人地址
    subjectTEXT邮件主题
    statusTEXTsuccess 或 failed
    errorTEXT,可空失败时的错误信息
    durationBIGINT耗时,毫秒
    created_atBIGINT时间戳(毫秒)

    索引:(sender_id, created_at DESC) 复合索引、status 索引。

    各数据库差异说明

    项目PostgreSQLMySQL / TiDBMongoDBSQLite
    数组列JSONBJSON原生数组JSON 字符串
    时间戳BIGINTBIGINTLongINTEGER
    主键TEXTVARCHAR(64)_id (String)TEXT
    外键级联支持支持应用层删除支持
    表前缀无无无无

    MongoDB 驱动在删除发件商时,由应用层同时删除其密钥与日志(MongoDB 无外键约束)。

    数据安全

    • SMTP 密码、OAuth Client Secret / Refresh Token 与 API 密钥均以 v1: 前缀的 AES-256-GCM 密文存储。
    • MAILPORT_SECRET 是唯一解密途径,不会写入数据库或日志。
    • 日志表不记录邮件正文、密钥明文。
    • 健康检查接口只返回配置是否存在,不返回任何凭据。