ClawSkills logoClawSkills

Zoho Email Integration

通过 OAuth2、REST API(快 5-10 倍)、Clawdbot /email 命令、HTML 邮件、附件和批量操作实现完整的 Zoho Mail 集成。安全强...

介绍

# Zoho Email Integration

**v2.2.6** - 完整的 Zoho Mail 集成,支持 OAuth2 身份验证、REST API 后端(比 IMAP/SMTP 快 5-10 倍),以及 **Clawdbot 扩展,支持 Telegram/Discord 的 /email 命令**。针对路径遍历和命令注入进行了**安全加固**。支持 HTML 邮件、附件、批量操作和高级自动化工作流。

选择您的身份验证方式:OAuth2(推荐,安全)或应用专用密码(设置简单)。

## 🔄 更新到最新版本

```bash clawhub install zoho-email-integration --force ```

或更新所有技能: ```bash clawhub update ```

## 🔒 安全提示 (v2.2.5+)

**关键修复:** 移除了有漏洞的 JavaScript 命令处理器。如果您部署了 examples 文件夹中的 `email-command.js`,请立即更新:

```bash # Re-download the secure handler clawhub install zoho-email-integration --force cp ~/.openclaw/skills/zoho-email-integration/examples/clawdbot-extension/email-command.js /your/deployment/path/ ```

易受攻击的版本使用带有 shell 插值的 `execSync`。新版本使用带有参数数组的 `spawn` 来防止命令注入。

## ✨ 功能

### 🔐 身份验证与性能 - **OAuth2 身份验证** - 基于令牌的安全认证,支持自动刷新 - **REST API 后端** - 操作速度比 IMAP/SMTP 快 5-10 倍 - **优雅降级** - 如果 REST API 不可用,自动回退到 IMAP - **应用专用密码支持** - OAuth2 的简单替代方案

### 📧 邮件操作 - **📥 读取邮件** - 从任意文件夹(收件箱、已发送、草稿箱等)获取 - **🔍 智能搜索** - 按主题、发件人、关键词搜索,速度如 REST API - **📊 监控收件箱** - 用于通知的实时未读计数 - **📤 发送邮件** - 纯文本或 HTML,支持抄送/密送 - **🎨 HTML 邮件** - 包含专业模板的丰富格式 - **📎 附件** - 发送和下载文件附件

### ⚡ 批量与批量操作 - **批量操作** - 高效地标记、删除或移动多封邮件 - **批量操作** - 一次搜索并对数百封邮件执行操作 - **试运行模式** - 在执行前预览操作以确保安全

### 🔒 安全 - **无硬编码凭据** - 仅使用 OAuth2 令牌或环境变量 - **自动令牌刷新** - 无缝令牌续期 - **加密连接** - 所有操作均使用 SSL/TLS

## 📦 安装

```bash clawdhub install zoho-email ```

**要求:** - Python 3.x - `requests` 库(安装:`pip3 install requests`) - Zoho Mail 账户

## ⚙️ 设置

### 1. 获取应用专用密码

**重要:** 请勿使用您的 Zoho 主密码!

1. 登录 Zoho Mail 2. 转到 **Settings** → **Security** → **App Passwords** 3. 为 "Clawdbot" 或 "IMAP/SMTP Access" 生成新的应用专用密码 4. 复制该密码(下一步需要)

### 2. 配置凭据

**选项 A:环境变量**

导出您的 Zoho 凭据:

```bash export ZOHO_EMAIL="[email protected]" export ZOHO_PASSWORD="your-app-specific-password" ```

**选项 B:凭据文件**

创建 `~/.clawdbot/zoho-credentials.sh`:

```bash #!/bin/bash export ZOHO_EMAIL="[email protected]" export ZOHO_PASSWORD="your-app-specific-password" ```

使其可执行并安全: ```bash chmod 600 ~/.clawdbot/zoho-credentials.sh ```

然后在运行前获取它: ```bash source ~/.clawdbot/zoho-credentials.sh ```

### 3. 测试连接

```bash python3 scripts/zoho-email.py unread ```

预期输出: ```json {"unread_count": 5} ```

## 🚀 使用

所有命令都需要通过环境变量设置的凭据。

### 快速命令(常见任务)

```bash # Diagnose setup (recommended first step) python3 scripts/zoho-email.py doctor

# Unread count (great for briefings) python3 scripts/zoho-email.py unread

# Search inbox python3 scripts/zoho-email.py search "invoice"

# Get a specific email (folder + id) python3 scripts/zoho-email.py get INBOX <id>

# Send a simple email python3 scripts/zoho-email.py send [email protected] "Subject" "Body text"

# Empty Spam (safe by default: DRY RUN) python3 scripts/zoho-email.py empty-spam # Execute for real python3 scripts/zoho-email.py empty-spam --execute

# Empty Trash (safe by default: DRY RUN) python3 scripts/zoho-email.py empty-trash # Execute for real python3 scripts/zoho-email.py empty-trash --execute ```

### 发送 HTML 邮件

发送丰富、格式化的 HTML 邮件,支持 multipart/alternative(同时包含 HTML 和纯文本版本):

**CLI 命令:** ```bash # Send HTML from a file python3 scripts/zoho-email.py send-html [email protected] "Newsletter" examples/templates/newsletter.html

# Send HTML from inline text python3 scripts/zoho-email.py send-html [email protected] "Welcome" "<h1>Hello!</h1><p>Welcome to our service.</p>"

# Preview HTML email before sending python3 scripts/zoho-email.py preview-html examples/templates/newsletter.html ```

**Python API:** ```python from scripts.zoho_email import ZohoEmail

zoho = ZohoEmail()

# Method 1: Send HTML with auto-generated plain text fallback zoho.send_html_email( to="[email protected]", subject="Newsletter", html_body="<h1>Hello!</h1><p>Welcome!</p>" )

# Method 2: Send HTML with custom plain text version zoho.send_email( to="[email protected]", subject="Newsletter", body="Plain text version of your email", html_body="<h1>Hello!</h1><p>HTML version of your email</p>" )

# Load HTML from template file with open('examples/templates/newsletter.html', 'r') as f: html_content = f.read()

zoho.send_html_email( to="[email protected]", subject="Monthly Newsletter", html_body=html_content ) ```

**功能:** - ✅ 多部分替代邮件(HTML + 纯文本) - ✅ 自动生成的纯文本回退 - ✅ 从文件或内联字符串加载 HTML - ✅ 发送前的预览模式以进行测试 - ✅ 完整的 CSS 样式支持 - ✅ 适用于所有邮件客户端

**模板:** `examples/templates/` 中提供现成模板: - `newsletter.html` - 专业简报布局 - `announcement.html` - 带有横幅的重要公告 - `welcome.html` - 入门欢迎邮件 - `simple.html` - 用于快速定制的基本 HTML 模板

### 检查未读数

```bash python3 scripts/zoho-email.py unread ```

非常适合晨间简报或通知系统。

### 搜索收件箱

```bash python3 scripts/zoho-email.py search "invoice" ```

返回最近 10 封匹配邮件,包含主题、发件人、日期和正文预览。

### 搜索已发送邮件

```bash python3 scripts/zoho-email.py search-sent "client name" ```

返回最近 5 封匹配的已发送邮件。

### 获取特定邮件

```bash python3 scripts/zoho-email.py get Inbox 4590 python3 scripts/zoho-email.py get Sent 1234 ```

返回完整邮件内容,包括完整正文。

### 发送邮件

```bash python3 scripts/zoho-email.py send "[email protected]" "Subject" "Email body here" ```

### 发送带附件的邮件

```bash python3 scripts/zoho-email.py send "[email protected]" "Invoice" "Please find the invoice attached" --attach invoice.pdf --attach receipt.jpg ```

支持使用 `--attach` 标志发送多个附件。

### 列出邮件附件

```bash python3 scripts/zoho-email.py list-attachments Inbox 4590 ```

返回包含附件详细信息的 JSON: ```json [ { "index": 0, "filename": "invoice.pdf", "content_type": "application/pdf", "size": 52341 }, { "index": 1, "filename": "receipt.jpg", "content_type": "image/jpeg", "size": 128973 } ] ```

### 下载附件

```bash # Download first attachment (index 0) with original filename python3 scripts/zoho-email.py download-attachment Inbox 4590 0

# Download second attachment (index 1) with custom filename python3 scripts/zoho-email.py download-attachment Inbox 4590 1 my-receipt.jpg ```

返回包含下载详细信息的 JSON: ```json { "filename": "invoice.pdf", "output_path": "invoice.pdf", "size": 52341, "content_type": "application/pdf" } ```

## 🤖 Clawdbot 集成示例

### 晨间简报

检查未读邮件并报告:

```bash UNREAD=$(python3 scripts/zoho-email.py unread | jq -r '.unread_count') echo "📧 You have $UNREAD unread emails" ```

### 邮件监控

监控 VIP 邮件:

```bash RESULTS=$(python3 scripts/zoho-email.py search "Important Client") COUNT=$(echo "$RESULTS" | jq '. | length')

if [ $COUNT -gt 0 ]; then echo "⚠️ New email from Important Client!" fi ```

### 自动回复

搜索和回复工作流:

```bash # Find latest invoice inquiry EMAIL=$(python3 scripts/zoho-email.py search "invoice" | jq -r '.[0]') FROM=$(echo "$EMAIL" | jq -r '.from')

# Send reply python3 scripts/zoho-email.py send "$FROM" "Re: Invoice" "Thanks for your inquiry..." ```

### 附件工作流

自动下载发票附件:

```bash # Search for invoice emails EMAILS=$(python3 scripts/zoho-email.py search "invoice")

# Get latest email ID EMAIL_ID=$(echo "$EMAILS" | jq -r '.[0].id')

# List attachments ATTACHMENTS=$(python3 scripts/zoho-email.py list-attachments Inbox "$EMAIL_ID")

# Download all PDF attachments echo "$ATTACHMENTS" | jq -r '.[] | select(.content_type == "application/pdf") | .index' | while read INDEX; do python3 scripts/zoho-email.py download-attachment Inbox "$EMAIL_ID" "$INDEX" "invoice_${INDEX}.pdf" echo "Downloaded invoice_${INDEX}.pdf" done ```

发送带附件的报告:

```bash # Generate report python3 generate_report.py > report.txt

# Send with attachment python3 scripts/zoho-email.py send "[email protected]" "Weekly Report" "Please see attached report" --attach report.txt --attach chart.png ```

## 📚 Python API

导入模块以进行编程使用:

```python from scripts.zoho_email import ZohoEmail

zoho = ZohoEmail()

# Search emails results = zoho.search_emails(folder="INBOX", query='SUBJECT "invoice"', limit=10)

# Get specific email email = zoho.get_email(folder="Sent", email_id="4590")

# Send plain text email zoho.send_email( to="[email protected]", subject="Hello", body="Message text", cc="[email protected]" # optional )

# Send HTML email (auto-generated plain text fallback) zoho.send_html_email( to="[email protected]", subject="Newsletter", html_body="<h1>Welcome!</h1><p>Rich HTML content here</p>", text_body="Welcome! Plain text version here" # optional, auto-generated if not provided )

# Send multipart email (HTML + custom plain text) zoho.send_email( to="[email protected]", subject="Update", body="Plain text version", html_body="<h1>HTML version</h1>", cc="[email protected]" )

# Send email with attachments zoho.send_email_with_attachment( to="[email protected]", subject="Invoice", body="Please find the invoice attached", attachments=["invoice.pdf", "receipt.jpg"], cc="[email protected]" # optional )

# List attachments attachments = zoho.get_attachments(folder="INBOX", email_id="4590") for att in attachments: print(f"{att['index']}: {att['filename']} ({att['size']} bytes)")

# Download attachment result = zoho.download_attachment( folder="INBOX", email_id="4590", attachment_index=0, output_path="downloaded_file.pdf" # optional, uses original filename if not provided )

# Check unread count count = zoho.get_unread_count() ```

## 📖 HTML 邮件示例

查看 `examples/send-html-newsletter.py` 中的完整示例:

```bash # Run the HTML email examples python3 examples/send-html-newsletter.py ```

这展示了: - 发送简单的内联 HTML - 加载并发送 HTML 模板 - 自定义纯文本回退 - 专业的邮件布局

**快速开始:** ```python #!/usr/bin/env python3 from scripts.zoho_email import ZohoEmail

zoho = ZohoEmail()

# Load a template with open('examples/templates/welcome.html', 'r') as f: html = f.read()

# Send to recipient zoho.send_html_email( to="[email protected]", subject="🎉 Welcome to Our Platform!", html_body=html ) ```

## 📁 文件夹参考

常见的 Zoho Mail 文件夹:

- `INBOX` - 主收件箱 - `Sent` - 已发送邮件 - `Drafts` - 草稿邮件 - `Spam` - 垃圾邮件文件夹 - `Trash` - 已删除邮件 - 自定义文件夹(例如 `INBOX/ClientName`)

## 🔧 高级配置

覆盖默认的 IMAP/SMTP 服务器(如果使用自托管的 Zoho Mail):

```bash export ZOHO_IMAP="imap.yourdomain.com" export ZOHO_SMTP="smtp.yourdomain.com" export ZOHO_IMAP_PORT="993" export ZOHO_SMTP_PORT="465" ```

## ❓ 故障排除

### 身份验证失败

- 确保在 Zoho Mail 设置中启用了 IMAP - 使用**应用专用密码**,而不是您的主密码 - 验证凭据是否正确导出

### 连接超时

- 检查防火墙是否允许端口 993 (IMAP) 和 465 (SMTP) - 验证 Zoho Mail 服务器状态 - 尝试使用不同的网络(企业防火墙可能会阻止 IMAP)

### 搜索无结果

- IMAP 搜索不区分大小写 - 尝试使用更广泛的关键词 - 验证文件夹名称正确(区分大小写)

### "ZOHO_EMAIL and ZOHO_PASSWORD must be set"

您忘记导出凭据了!请运行:

```bash export ZOHO_EMAIL="[email protected]" export ZOHO_PASSWORD="your-app-password" ```

## 🛣️ 路线图

### ✅ 已完成 (v2.0.0)

- [x] **OAuth2 身份验证** - 基于令牌的安全认证,支持自动刷新 - [x] **Zoho Mail REST API** - 比 IMAP/SMTP 快 5-10 倍 - [x] **附件支持** - 下载和发送附件 - [x] **HTML 邮件撰写** - 包含模板的丰富格式 - [x] **批量操作** - 标记、删除、移动多封邮件 - [x] **批量操作** - 一次搜索并对多封邮件执行操作

### 🔮 未来增强

- [ ] **邮件线程/会话** - 将相关邮件分组 - [ ] **标签管理** - 创建和管理 Zoho Mail 标签 - [ ] **草稿邮件管理** - 创建、编辑和发送草稿 - [ ] **定时发送** - 安排稍后发送邮件 - [ ] **邮件模板** - 带有变量的可重用邮件模板 - [ ] **Webhooks** - 新邮件的实时通知 - [ ] **高级搜索** - 按大小、是否有附件、日期范围过滤 - [ ] **Zoho 日历集成** - 从邮件创建事件 - [ ] **Zoho CRM 集成** - 同步联系人和活动

## 📝 注意事项

- **搜索限制:** 默认返回最近 5-10 封邮件(可在代码中配置) - **正文截断:** 搜索结果显示前 500 个字符 - **编码:** 处理 UTF-8 和各种邮件编码 - **安全性:** 凭据除了发送到 Zoho 服务器外,绝不会离开您的系统

## 🤝 贡献

发现错误或想要贡献?请在 GitHub 上提交问题或 PR!

## 📄 许可证

MIT 许可证 - 可自由使用、修改和分发。

---

**创建时间:** 2026-01-29 **状态:** 生产就绪 ✅ **要求:** Python 3.x。对于 REST API 模式:`pip install -r requirements.txt`(包含 `requests`)。

## 🔄 批量操作

v1.1 中的新功能!使用批量命令高效处理多封邮件。

### 将多封邮件标记为已读

```bash python3 scripts/zoho-email.py mark-read INBOX 1001 1002 1003 ```

在一个命令中将几封邮件标记为已读。非常适合清除通知。

### 将多封邮件标记为未读

```bash python3 scripts/zoho-email.py mark-unread INBOX 1004 1005 ```

标记重要邮件以便稍后查看。

### 删除多封邮件

```bash python3 scripts/zoho-email.py delete INBOX 2001 2002 2003 ```

**安全:** 删除前会要求确认。邮件将被移至废纸篓(而非永久删除)。

### 在文件夹之间移动邮件

```bash python3 scripts/zoho-email.py move INBOX "Archive/2024" 3001 3002 3003 ```

通过将邮件移动到自定义文件夹来整理邮件。

### 使用搜索进行批量操作

对匹配搜索查询的所有邮件执行操作:

```bash # Dry run first - see what would be affected python3 scripts/zoho-email.py bulk-action \ --folder INBOX \ --search 'SUBJECT "newsletter"' \ --action mark-read \ --dry-run

# Execute the action python3 scripts/zoho-email.py bulk-action \ --folder INBOX \ --search 'SUBJECT "newsletter"' \ --action mark-read ```

**可用操作:** - `mark-read` - 将所有匹配邮件标记为已读 - `mark-unread` - 将所有匹配邮件标记为未读 - `delete` - 将所有匹配邮件移至废纸篓

**搜索查询示例:** ```bash # By subject --search 'SUBJECT "invoice"'

# By sender --search 'FROM "[email protected]"'

# Unread emails --search 'UNSEEN'

# Combine criteria (AND) --search '(SUBJECT "urgent" FROM "[email protected]")'

# Date range --search 'SINCE 01-Jan-2024' ```

### Python 中的批量操作

```python from scripts.zoho_email import ZohoEmail

zoho = ZohoEmail()

# Mark multiple emails as read result = zoho.mark_as_read(['1001', '1002', '1003'], folder="INBOX") print(f"Success: {len(result['success'])}, Failed: {len(result['failed'])}")

# Delete multiple emails result = zoho.delete_emails(['2001', '2002'], folder="INBOX")

# Move emails to another folder result = zoho.move_emails( email_ids=['3001', '3002'], target_folder="Archive/2024", source_folder="INBOX" )

# Bulk action with search result = zoho.bulk_action( query='SUBJECT "newsletter"', action='mark-read', folder="INBOX", dry_run=True # Preview first )

print(f"Found {result['total_found']} emails") print(f"Will process {result['to_process']} emails")

# Execute for real result = zoho.bulk_action( query='SUBJECT "newsletter"', action='mark-read', folder="INBOX", dry_run=False ) ```

### 批量清理示例

自动清理旧简报:

```bash # 1. Preview what will be deleted python3 scripts/zoho-email.py bulk-action \ --folder INBOX \ --search 'SUBJECT "newsletter"' \ --action delete \ --dry-run

# 2. Review the preview output

# 3. Execute if satisfied python3 scripts/zoho-email.py bulk-action \ --folder INBOX \ --search 'SUBJECT "newsletter"' \ --action delete ```

请参阅 `examples/batch-cleanup.py` 获取完整的自动清理脚本。

更多产品