# 常见陷阱与故障排除
## 关键隐患
### 流消耗 (最常见)
**问题:** "stream already consumed" 或 worker 挂起
**原因:** `message.raw` 是 `ReadableStream` - 只能消耗一次
**解决方案:**
typescript
// ❌ 错误
const email1 = await parser.parse(await message.raw.arrayBuffer());
const email2 = await parser.parse(await message.raw.arrayBuffer()); // 失败
// ✅ 正确
const raw = await message.raw.arrayBuffer();
const email = await parser.parse(raw);
在任何异步操作之前立即消耗 `message.raw`。
### 目标验证
**问题:** 邮件未转发
**原因:** 目标未验证
**解决方案:** 添加目标,检查收件箱中的验证邮件,点击链接。验证状态: `GET /zones/{id}/email/routing/addresses`
### 邮件认证
**问题:** 合法邮件被拒绝
**原因:** 发件人域名缺少 SPF/DKIM/DMARC
**解决方案:** 配置发件人 DNS:
dns
example.com. IN TXT "v=spf1 include:_spf.example.com ~all"
selector._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=..."
_dmarc.example.com. IN TXT "v=DMARC1; p=quarantine"
### 信封 vs 标头
**问题:** 在错误的地址上进行过滤
**解决方案:**
typescript
// 路由/认证: 信封
if (message.from === "
[email protected]") { }
// 显示: 标头
const display = message.headers.get("from");
### SendEmail 限制
| 问题 | 限制 | 解决方案 |
|-------|-------|----------|
| 发件人域名 | 必须拥有 | 使用电子邮件路由域名 |
| 容量 | ~100/分钟 (免费) | 升级或限流 |
| 附件 | 不支持 | 链接到 R2 |
| 类型 | 事务性 | 不支持群发 |
## 常见错误
### CPU 时间超限
**原因:** 解析繁重、邮件过大
**解决方案:**
typescript
const size = parseInt(message.headers.get("content-length") || "0") / 1024 / 1024;
if (size > 20) {
message.setReject("太大");
return;
}
ctx.waitUntil(expensiveWork());
await message.forward("
[email protected]");
### 规则未触发
**原因:** 优先级冲突、匹配器错误、全匹配覆盖
**解决方案:** 检查优先级(越小越优先)、验证精确匹配、确认目标已验证
### 未定义属性
**原因:** 缺少标头
**解决方案:**
typescript
// ❌ 错误
const subj = message.headers.get("subject").toLowerCase();
// ✅ 正确
const subj = message.headers.get("subject")?.toLowerCase() || "";
## 限制
| 资源 | 免费 | 付费 |
|----------|------|------|
| 邮件大小 | 25 MB | 25 MB |
| 规则