Zeabur EmailAPI 密钥管理

API 密钥管理

API 密钥用于验证您的 Zeabur Email API 请求。每个密钥可以设置不同的权限级别。

权限类型

Zeabur Email 提供三种权限级别:

权限类型说明适用场景
只读 (read_only)只能查询邮件和统计信息数据分析、监控面板
只发送 (send_only)可以发送邮件和查询状态生产环境应用(推荐)
完全权限 (all)包含所有操作权限管理工具、开发环境
⚠️

出于安全考虑,建议在生产环境使用「只发送」权限,避免使用「完全权限」。

创建 API 密钥

登录控制台

访问 Zeabur 控制台的 Zeabur Email 管理页面。

创建新密钥

  1. 进入「API 密钥管理」
  2. 点击「创建 API 密钥」
  3. 输入密钥名称(用于识别用途)
  4. 选择权限类型
  5. (可选)限制允许使用的域名
  6. 点击「创建」

保存密钥

🚫

密钥仅在创建时显示一次!请立即保存到安全的地方。

创建后,系统会显示完整的 API 密钥。复制并安全保存,您将无法再次查看完整密钥。

域名限制

您可以限制 API 密钥只能从特定域名发送邮件,增加安全性:

// 创建密钥时设置允许的域名
{
  "name": "Production API Key",
  "permission": "send_only",
  "allowed_domains": ["yourdomain.com", "mail.yourdomain.com"]
}

这样,即使密钥泄露,攻击者也无法使用未授权的域名发送邮件。

使用 API 密钥

HTTP 请求头

在所有 API 请求中包含密钥:

POST /api/v1/zsend/emails
Host: api.zeabur.com
Content-Type: application/json
Authorization: Bearer zs_your_api_key_here
 
{
  "from": "[email protected]",
  ...
}

代码示例

JavaScript

const apiKey = process.env.ZSEND_API_KEY;
 
const response = await fetch('https://api.zeabur.com/api/v1/zsend/emails', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + apiKey
  },
  body: JSON.stringify({
    from: '[email protected]',
    to: ['[email protected]'],
    subject: '测试邮件',
    html: '<p>测试内容</p>'
  })
});

Python

import os
import requests
 
api_key = os.environ.get('ZSEND_API_KEY')
 
response = requests.post(
    'https://api.zeabur.com/api/v1/zsend/emails',
    headers={
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + api_key
    },
    json={
        'from': '[email protected]',
        'to': ['[email protected]'],
        'subject': '测试邮件',
        'html': '<p>测试内容</p>'
    }
)

Go

package main
 
import (
    "bytes"
    "encoding/json"
    "net/http"
    "os"
)
 
func sendEmail() error {
    apiKey := os.Getenv("ZSEND_API_KEY")
    
    payload := map[string]interface{}{
        "from":    "[email protected]",
        "to":      []string{"[email protected]"},
        "subject": "测试邮件",
        "html":    "<p>测试内容</p>",
    }
    
    jsonData, _ := json.Marshal(payload)
    req, _ := http.NewRequest("POST", "https://api.zeabur.com/api/v1/zsend/emails", bytes.NewBuffer(jsonData))
    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("Authorization", "Bearer " + apiKey)
    
    client := &http.Client{}
    resp, err := client.Do(req)
    return err
}

轮换密钥

定期轮换 API 密钥是良好的安全实践:

创建新密钥

创建一个新的 API 密钥,保持旧密钥处于活跃状态。

更新应用配置

逐步将应用中的 API 密钥更新为新密钥。

删除旧密钥

确认所有应用都已更新后,删除旧密钥。

建议每 90 天轮换一次密钥。

撤销密钥

如果密钥泄露或不再需要:

  1. 进入「API 密钥管理」
  2. 找到要删除的密钥
  3. 点击「删除」按钮
  4. 确认删除
⚠️

删除密钥后,使用该密钥的所有 API 请求将立即失败。

安全最佳实践

1. 使用环境变量

永远不要在代码中硬编码 API 密钥:

// ❌ 不推荐:不要硬编码
const apiKey = 'zs_xxxxxxxxxxxxxxxxxxxxxxxx';
 
// ✅ 推荐:使用环境变量
const apiKey = process.env.ZSEND_API_KEY;

2. 使用最小权限原则

为不同的应用创建具有适当权限的独立密钥:

  • 生产应用:只发送权限 + 域名限制
  • 数据分析:只读权限
  • 管理工具:完全权限(仅在必要时)

3. 监控密钥使用情况

在 Zeabur Email 控制台查看每个密钥的使用统计:

  • 请求次数
  • 发送邮件数量
  • 错误率

发现异常使用立即撤销密钥。

4. 不要共享密钥

为每个应用、环境(开发/生产)创建独立的密钥,便于追踪和管理。

故障排查

401 Unauthorized

{
  "error": "unauthorized",
  "message": "Invalid or missing API key"
}

可能原因

  • API 密钥错误或已删除
  • 请求头格式错误(应为 Authorization: Bearer <token>
  • 密钥前后有空格或缺少 Bearer 前缀

403 Forbidden

{
  "error": "permission denied",
  "message": "API key does not have permission to send from this domain"
}

可能原因

  • 密钥权限不足(如使用只读密钥发送邮件)
  • 发件域名不在密钥的允许列表中
  • 域名未验证

429 Too Many Requests

{
  "error": "too many requests",
  "message": "Rate limit exceeded"
}

解决方案

  • 实现请求限流和重试机制
  • 考虑升级账号以获取更高的频率限制
  • 使用批量发送 API 减少请求次数