# 德国邮件外联活动 (German Email Campaign)

## 📊 数据概览

- **数据来源**: `business_dedup_email_only_by_country_20260415_1541.xlsx` (德国 sheet)
- **原始记录数**: 2,539 条
- **有效邮箱数**: 2,444 条
- **去重数量**: 13 条
- **无效邮箱**: 82 条
- **数据提取日期**: 2026-04-15

## 📁 文件结构

```
email_campaign_de/
├── de_email_cleaned.csv          # 清洗后的邮箱名单 (CSV)
├── de_email_cleaned.xlsx         # 清洗后的邮箱名单 (Excel)
├── email_templates_de.js         # 德语/双语邮件模板
├── send_campaign_de.js           # 发送脚本（生产就绪版）
├── send_log.jsonl                # 发送日志（运行后生成）
├── unsubscribed.txt              # 退订名单
├── stats.json                    # 数据统计
└── README_DE.md                  # 本文档
```

## 📋 数据字段说明

清洗后的名单包含以下字段：

| 字段 | 说明 | 示例 |
|------|------|------|
| `email` | 邮箱地址 | `creator@example.com` |
| `nickname` | 达人昵称 | `Max Creator` |
| `tiktok_account` | TikTok 账号 | `@maxcreator` |
| `uid` | 达人 UID | `1234567890` |
| `profile_url` | 主页链接 | `https://www.tiktok.com/@maxcreator` |
| `followers` | 粉丝数 | `50000` |
| `instagram` | Instagram 账号 | `maxcreator_ig` |
| `external_link` | 外部联系链接 | `https://...` |
| `other_contact` | 其他联系方式 | `WhatsApp: +49...` |
| `region` | 地区 | `DE` |
| `tier` | 达人级别 | `micro` / `mid` / `macro` |

### 达人级别分类

- **micro**: 粉丝数 < 10,000
- **mid**: 粉丝数 10,000 - 99,999
- **macro**: 粉丝数 ≥ 100,000

## 📧 邮件模板

提供三种模板类型：

### 1. `german` - 纯德语版本
- 适合德语母语达人
- 专业正式的德语表达

### 2. `bilingual` - 双语版本（推荐，默认）
- 德语 + 英语双语内容
- 覆盖更广泛的受众
- **默认使用此模板**

### 3. `short_german` - 简短德语版本
- 简洁明了
- 适合快速浏览

### 模板变量

所有模板支持以下占位符：
- `{{nickname}}` - 达人昵称
- `{{tiktok_account}}` - TikTok 账号

## 🚀 使用方法

### 前置要求

1. **环境配置文件**: 确保 `.env.email` 存在于 `C:\Users\Terry\.openclaw\agents\fastmoss\workspace\.env.email`
2. **Node.js 依赖**: 已安装 `nodemailer`

### 1. 测试发送

```bash
# 发送 1 封测试邮件到 mkt@feliex.com
node send_campaign_de.js --test
```

### 2. 模拟运行（不实际发送）

```bash
# 模拟发送前 10 封邮件，查看效果
node send_campaign_de.js --dry-run --limit 10
```

### 3. 实际发送

```bash
# 发送首批 50 封（step 1 - 首次邮件）
node send_campaign_de.js --limit 50

# 发送 follow-up 1（step 2，给已发送 step 1 的达人）
node send_campaign_de.js --step 2 --limit 50

# 发送 follow-up 2（step 3，最后一次跟进）
node send_campaign_de.js --step 3 --limit 50
```

### 4. 命令行参数

| 参数 | 说明 | 默认值 |
|------|------|--------|
| `--test` | 发送 1 封测试邮件到 mkt@feliex.com | `false` |
| `--dry-run` | 模拟运行，不实际发送 | `false` |
| `--limit <数量>` | 限制发送数量 | 999999 |
| `--step <1\|2\|3>` | 发送步骤（1=首次，2=follow-up1，3=follow-up2） | `1` |
| `--input <路径>` | 输入 CSV 文件 | `de_email_cleaned.csv` |

## 📊 发送日志

发送后会生成 `send_log.jsonl`（JSONL 格式，每行一条记录）：

```json
{"email":"creator@example.com","step":1,"sent_at":"2026-05-05T10:21:00.000Z","nickname":"Max","tiktok_account":"maxcreator","status":"sent"}
{"email":"another@example.com","step":1,"sent_at":"2026-05-05T10:22:00.000Z","nickname":"Anna","status":"failed","error":"Connection timeout"}
```

### 日志字段说明

- `email`: 收件人邮箱
- `step`: 发送步骤（1/2/3）
- `sent_at`: 发送时间（ISO 8601）
- `nickname`: 达人昵称
- `tiktok_account`: TikTok 账号
- `status`: 状态（`sent` / `failed`）
- `error`: 失败原因（仅失败时）

## ⚙️ 核心特性

### 1. 速率限制
- 每封邮件间隔 30-90 秒（随机）
- 避免触发垃圾邮件过滤器

### 2. 去重机制
- 自动跟踪已发送邮件
- 同一邮箱 + 同一步骤不会重复发送

### 3. 退订管理
- 维护 `unsubscribed.txt` 退订名单
- 自动跳过退订邮箱

### 4. 断点续发
- 基于 `send_log.jsonl` 自动续发
- 支持分批发送

### 5. 个性化
- 自动替换 `{{nickname}}` 和 `{{tiktok_account}}`
- 使用双语模板覆盖更广受众

## 📈 最佳实践

### 发送策略

1. **第一天**: 测试 + 首批 50 封
   ```bash
   node send_campaign_de.js --test
   node send_campaign_de.js --limit 50
   ```

2. **第二天**: 继续发送 step 1（100-200 封/天）
   ```bash
   node send_campaign_de.js --limit 200
   ```

3. **第三天**: 发送 follow-up 1 给已发送 step 1 的达人
   ```bash
   node send_campaign_de.js --step 2 --limit 50
   ```

4. **第七天**: 发送 follow-up 2（最后跟进）
   ```bash
   node send_campaign_de.js --step 3 --limit 50
   ```

### 监控建议

- 每天检查 `send_log.jsonl` 中的失败记录
- 跟踪回复率和打开率
- 根据反馈调整模板内容

## 🔒 数据清洗规则

已应用以下清洗规则：

- ✅ 邮箱格式验证（包含 @ 和 .）
- ✅ 按邮箱去重
- ✅ 排除无效邮箱前缀：
  - `noreply@`
  - `test@`
  - `admin@`
  - `no-reply@`
  - `donotreply@`

## 📞 联系方式统计

清洗后的名单中：
- **有邮箱**: 2,444 条（100%）
- **有 Instagram**: 约 907 条（根据原始数据）
- **有外链**: 约 1,483 条（根据原始数据）
- **有其他联系方式**: 约 190 条（根据原始数据）

## ⚠️ 注意事项

- ✅ 脚本已集成 Nodemailer，生产就绪
- ✅ 使用 `.env.email` 配置 SMTP 凭证
- ⚠️ 请遵守德国和欧盟的数据保护法规（GDPR）
- ⚠️ 确保有合法的联系理由和退订机制
- ⚠️ 监控发送域名的信誉度
- ⚠️ 建议每天发送量不超过 200 封

## 🛠️ 故障排查

### SMTP 连接失败
```bash
# 检查 .env.email 配置
cat C:\Users\Terry\.openclaw\agents\fastmoss\workspace\.env.email
```

### 查看发送统计
```bash
# 统计已发送数量
node -e "console.log(require('fs').readFileSync('send_log.jsonl','utf-8').split('\n').filter(l=>l.trim()).length)"
```

### 重置发送日志（谨慎使用）
```bash
# 备份现有日志
copy send_log.jsonl send_log.jsonl.backup

# 删除日志（将重新发送所有邮件）
del send_log.jsonl
```

## 📝 更新日志

- **2026-05-05**: 生产就绪版本
  - ✅ 完全复用英国版 Nodemailer 配置
  - ✅ 集成德语/双语模板
  - ✅ 支持 step 1/2/3 多步骤发送
  - ✅ 速率限制 30-90 秒
  - ✅ 去重 + 退订管理
  - ✅ JSONL 日志格式

---

**生成时间**: 2026-05-05  
**数据版本**: 20260415_1541  
**脚本版本**: 2.0.0 (Production Ready)  
**模板**: 德语/双语 (Bilingual)
