ToBeWin

Email Writer

办公效率v1.0.5
作者:ToBeWin✓ SkillHub 认证更新于 2026-07-03email-writer@user_9fe56694/email-writer
邮件处理

据 AlphaMoat 统计,截至 2026-09,Email Writer 累计下载 1,480 次、获 1 个星标,在全部 5,078 个 AI 技能中排名第 4,782 位,在「办公效率」分类(435 个)中排名第 392 位。

累计安装
119
累计下载
1,480
星标
1
全站排名
#4,782
全站前 95% · 「办公效率」前 91%
平台累计安装累计下载星标评论
ClawHub ↗3437--
SkillHub ↗1191,4801—

各平台的计数口径不同,统计时间不一致。

这个技能是做什么的

支持 Gmail、Outlook、QQ 邮箱和 163 邮箱。仅在用户明确要求向特定收件人写信并发送时触发;浏览器操作前核对收件人、主题、要点、语气和邮箱登录状态。邮件正文与附件会经浏览器发送到所选服务商。支持中英文邮件;验证码、加密邮件和批量发送不在文档支持范围内。

资料发布于 2026-10-26

可以用来做什么

  • 在指定邮箱中撰写并发送邮件

什么时候用

  • 需要通过已登录的网页邮箱发送邮件时

示例提示词

以下是根据技能文档生成的示例,不代表实际运行结果。

帮我给指定收件人写一封邮件。开始浏览器操作前,请先核对收件人、主题、要点、语气和登录状态。

使用条件

依据技能文档中的声明整理,未经实际安装或运行验证。

鉴权说明
需要 OpenClaw v2026.3.22 或更高版本及浏览器访问。
配置要求
  • 邮件内容和附件会发送到用户选择的邮件服务商;敏感内容请谨慎处理。

月度数据趋势

累计下载1,480
4651,0101,5552026-03 · 累计下载 5402026-05 · 累计下载 7712026-07 · 累计下载 9632026-09 · 累计下载 1,48026-0326-09
星标1
0122026-03 · 星标 12026-05 · 星标 12026-07 · 星标 12026-09 · 星标 126-0326-09

2026-09 起统计方法调整:同名技能按作者分别统计,并覆盖全部技能。图中虚线为调整前的月份,与之后的数据不直接比较,也不计算跨越调整的增长。 该技能有同名的其他版本,调整前的数据归属当前下载量最大的这一个。

月份累计下载环比星标
2026-091,480—1
2026-07963—1
2026-05771—1
2026-03540—1

SKILL.md 原文

以下是作者发布的原始文件,按纯文本显示,本站未做修改或审核;其中的链接不可点击,命令请核实后再运行。抓取于 2026-10-23。

11 KB · ClawHub v1.0.5
---
name: email-writer
description: Draft and send emails via browser automation. Supports Gmail, Outlook, QQ Mail, 163 Mail. Requires OpenClaw v2026.3.22+ with browser access.
version: 1.0.5
license: MIT-0
metadata: {"openclaw": {"emoji": "📧", "requires": {"bins": [], "env": []}, "minVersion": "2026.3.22", "needsBrowser": true}}
---

# Email Writer
展开全部(共 410 行)
Email composition and sending tool using OpenClaw browser automation.

> ⚠️ **数据外发提醒**:邮件内容(收件人、主题、正文)、附件将通过浏览器发送至用户选择的邮件服务商(Gmail / Outlook / QQ Mail / 163 Mail)的服务器。请勿在邮件中包含敏感信息。
>
> ⚠️ **安全提醒**:此 skill 通过浏览器自动填写并发送邮件。使用前请确认用户已在浏览器中登录邮箱。建议先用不重要的账号测试。

## Trigger Conditions

Only trigger when the user **explicitly asks to write and send an email to a specific recipient**. Do NOT trigger for:
- General questions about email format or best practices
- Drafting text that happens to be email-like without a "send" intent
- The user just copy-pasting an email address

## Features

- Draft professional emails with AI assistance
- Reply to emails with context
- Support Gmail, Outlook, QQ Mail, 163 Mail
- Multi-language support (Chinese and English)

## Trigger Conditions

Only trigger when the user **explicitly asks to write and send an email** — they provide a recipient, subject, or content. Do NOT trigger for:
- General questions about email format or best practices
- Drafting text that happens to be email-like without a "send" intent
- The user just copy-pasting an email address in conversation

Specific phrases (only when accompanied by actual email content):
- "发送邮件给..."
- "帮我写一封邮件..."
- "回复这封邮件..."
- "Send an email to..."

**Before any browser action, always first confirm with the user:**
1. Recipient email address
2. Subject line
3. Key content points
4. Formal or informal tone
5. That the user is already logged into their email in the browser

## Privacy Warning

> ⚠️ 邮件内容通过浏览器发送至邮件服务商(Gmail/Outlook/QQ/163)的服务器。所有 processing 在本地进行,但发送是网络操作。

## Step 1: Understand Email Request

Ask user for email details:

- Recipient email address
- Subject line
- Content/key points
- Formal or informal tone
- Language preference

## Step 2: Detect Email Provider

```javascript
// Detect which email provider based on URL
function detectProvider(url) {
  if (url.includes('mail.google.com') || url.includes('gmail.com')) return 'gmail';
  if (url.includes('outlook.live.com') || url.includes('outlook.com')) return 'outlook';
  if (url.includes('mail.qq.com')) return 'qq';
  if (url.includes('mail.163.com')) return '163';
  if (url.includes('mail.126.com')) return '126';
  return 'unknown';
}
```

## Step 3: Open Email Client

```javascript
// Open email client based on user preference
await browser.open({ url: "https://mail.google.com" })
await browser.wait({ timeout: 5000 })
```

Supported platforms:
- Gmail: mail.google.com
- Outlook: outlook.live.com
- QQ Mail: mail.qq.com
- 163 Mail: mail.163.com
- 126 Mail: mail.126.com

## Step 4: Compose New Email

### Gmail Compose

```javascript
// Click compose button (Gmail)
await browser.click({ selector: '[gh="cm"]' })
await browser.wait({ timeout: 2000 })

// Fill recipient
await browser.evaluate((email) => {
  const toField = document.querySelector('[name="to"]');
  if (toField) {
    toField.focus();
    toField.value = email;
    toField.dispatchEvent(new Event('input', { bubbles: true }));
  }
}, recipientEmail)

// Fill subject
await browser.evaluate((subject) => {
  const subjectField = document.querySelector('[name="subjectbox"]');
  if (subjectField) {
    subjectField.focus();
    subjectField.value = subject;
  }
}, emailSubject)

// Fill body
await browser.evaluate((body) => {
  const bodyField = document.querySelector('[role="textbox"][contenteditable="true"]');
  if (bodyField) {
    bodyField.focus();
    bodyField.innerHTML = body.replace(/\n/g, '<br>');
  }
}, emailBody)

// Send (Gmail)
await browser.click({ selector: '[gh="s"]' })
```

### Outlook Compose

```javascript
// Click new message button (Outlook)
await browser.click({ selector: '[aria-label="New message"], .ms-Button--primary' })
await browser.wait({ timeout: 2000 })

// Fill recipient (Outlook)
await browser.evaluate((email) => {
  const toField = document.querySelector('[aria-label="To"], input[placeholder*="To"]');
  if (toField) {
    toField.focus();
    toField.value = email;
    toField.dispatchEvent(new Event('input', { bubbles: true }));
  }
}, recipientEmail)

// Fill subject (Outlook)
await browser.evaluate((subject) => {
  const subjectField = document.querySelector('[aria-label="Subject"], input[placeholder*="Subject"]');
  if (subjectField) {
    subjectField.focus();
    subjectField.value = subject;
  }
}, emailSubject)

// Fill body (Outlook)
await browser.evaluate((body) => {
  const bodyField = document.querySelector('[aria-label="Message body"], [role="textbox"]');
  if (bodyField) {
    bodyField.focus();
    bodyField.innerHTML = body.replace(/\n/g, '<br>');
  }
}, emailBody)

// Send (Outlook)
await browser.click({ selector: '[aria-label="Send"], button[title="Send"]' })
```

### QQ Mail Compose

```javascript
// Click compose button (QQ Mail)
await browser.click({ selector: '.compose-button, .btn-compose, [title="写信"]' })
await browser.wait({ timeout: 2000 })

// Fill recipient (QQ Mail)
await browser.evaluate((email) => {
  const toField = document.querySelector('#to_input, input[name="to"]') ||
                  document.querySelector('[aria-label="收件人"]');
  if (toField) {
    toField.focus();
    toField.value = email;
    toField.dispatchEvent(new Event('input', { bubbles: true }));
  }
}, recipientEmail)

// Fill subject (QQ Mail)
await browser.evaluate((subject) => {
  const subjectField = document.querySelector('#subject, input[name="subject"]');
  if (subjectField) {
    subjectField.focus();
    subjectField.value = subject;
  }
}, emailSubject)

// Fill body (QQ Mail)
await browser.evaluate((body) => {
  const bodyField = document.querySelector('#QMEditorArea iframe') ||
                    document.querySelector('.qmEditorArea');
  if (bodyField) {
    if (bodyField.tagName === 'IFRAME') {
      bodyField.contentDocument.body.innerHTML = body.replace(/\n/g, '<br>');
    } else {
      bodyField.innerHTML = body.replace(/\n/g, '<br>');
    }
  }
}, emailBody)

// Send (QQ Mail)
await browser.click({ selector: '.btn-send, [title="发送"], .qmBtn' })
```

### 163 Mail Compose

```javascript
// Click compose button (163 Mail)
await browser.click({ selector: '.nui-mainToolbar-btn, .js-component-composebtn' })
await browser.wait({ timeout: 2000 })

// Fill recipient (163 Mail)
await browser.evaluate((email) => {
  const toField = document.querySelector('#draft_to_input, input[name="to"]') ||
                  document.querySelector('.nui-editableAddr-input');
  if (toField) {
    toField.focus();
    toField.value = email;
    toField.dispatchEvent(new Event('input', { bubbles: true }));
  }
}, recipientEmail)

// Fill subject (163 Mail)
await browser.evaluate((subject) => {
  const subjectField = document.querySelector('#draft_subject, input[name="subject"]');
  if (subjectField) {
    subjectField.focus();
    subjectField.value = subject;
  }
}, emailSubject)

// Fill body (163 Mail)
await browser.evaluate((body) => {
  const bodyField = document.querySelector('.APP-editor-iframe iframe') ||
                    document.querySelector('.nuiEditor');
  if (bodyField) {
    if (bodyField.tagName === 'IFRAME') {
      bodyField.contentDocument.body.innerHTML = body.replace(/\n/g, '<br>');
    } else {
      bodyField.innerHTML = body.replace(/\n/g, '<br>');
    }
  }
}, emailBody)

// Send (163 Mail)
await browser.click({ selector: '.nui-mainToolbar-sendBtn, .js-component-sendbtn' })
```

## Step 5: Reply to Email

### Gmail Reply

```javascript
await browser.click({ selector: '.zA' })
await browser.click({ selector: '[aria-label="Reply"]' })
await browser.wait({ timeout: 2000 })
await browser.evaluate((body) => {
  const bodyField = document.querySelector('[role="textbox"][contenteditable="true"]');
  if (bodyField) bodyField.innerHTML = body.replace(/\n/g, '<br>');
}, replyBody)
await browser.click({ selector: '[gh="s"]' })
```

### Outlook Reply

```javascript
await browser.click({ selector: '[aria-label="Reply"]' })
await browser.wait({ timeout: 2000 })
await browser.evaluate((body) => {
  const bodyField = document.querySelector('[aria-label="Message body"]');
  if (bodyField) bodyField.innerHTML = body.replace(/\n/g, '<br>');
}, replyBody)
await browser.click({ selector: '[aria-label="Send"]' })
```

### QQ Mail Reply

```javascript
await browser.click({ selector: '.btn-reply, [title="回复"]' })
await browser.wait({ timeout: 2000 })
await browser.evaluate((body) => {
  const iframe = document.querySelector('#QMEditorArea iframe');
  if (iframe) iframe.contentDocument.body.innerHTML = body.replace(/\n/g, '<br>');
}, replyBody)
await browser.click({ selector: '.btn-send, [title="发送"]' })
```

### 163 Mail Reply

```javascript
await browser.click({ selector: '.js-component-replybtn, [title="回复"]' })
await browser.wait({ timeout: 2000 })
await browser.evaluate((body) => {
  const iframe = document.querySelector('.APP-editor-iframe iframe');
  if (iframe) iframe.contentDocument.body.innerHTML = body.replace(/\n/g, '<br>');
}, replyBody)
await browser.click({ selector: '.js-component-sendbtn' })
```

## Step 6: Send Confirmation

```javascript
// Wait for send
await browser.wait({ timeout: 3000 })

// Check for success message
const sent = await browser.evaluate(() => {
  const text = document.body.innerText;
  return text.includes('Message sent') ||
         text.includes('Sent') ||
         text.includes('已发送') ||
         text.includes('发送成功') ||
         text.includes('邮件已发送');
})

if (sent) {
  console.log("Email sent successfully!")
}
```

## Email Templates

### Thank You Email

Subject: Thank you for your support

Dear [Name],

Thank you for [specific reason].

[Details]

Best regards,
[Your name]

### Work Report

Subject: Work Report - [Date]

Hi Manager,

Weekly report:

1. Completed tasks
2. In progress
3. Next week plan

Best,
[Your name]

### Meeting Invitation

Subject: Meeting: [Topic]

Hi [Name],

Please join our meeting:

Time: [Time]
Location: [Location/Link]
Agenda:
1. Topic 1
2. Topic 2

Please confirm your attendance.

Thanks,
[Your name]

## Error Handling

- Email not logged in: Prompt user to log in
- Send failed: Prompt user to send manually
- Attachment failed: Suggest manual attachment
- Unknown provider: Ask user which email service

## Limitations

- Cannot handle email verification codes
- Cannot send encrypted emails
- No batch sending support
- QQ/163 may need iframe handling

## Privacy and Security

- No email content uploaded externally
- All processing done locally
- Browser email session accessed
- Review before sending sensitive information

## Notes

- Requires OpenClaw v2026.3.22+
- Gmail has most reliable selectors
- QQ/163 use iframe for email body
- Test with non-sensitive account first

「办公效率」分类下的热门技能

腾讯文档 TENCENT DOCS办公效率

腾讯文档(docs.qq.com)-在线云文档平台,是创建、编辑、管理文档的首选 skill。涉及"新建/创建/编辑/读取/查看/搜索文档"、"保存文件"、"云文档"、"腾讯文档"、"docs.qq.com"等操作,请优先使用本 skill。支持能力:(1) 创建各类在线文档(文档/Word/Excel/幻灯片/思维导图/流程图/智能表格/收集表)(2) 管理知识库空间(创建空间、查询空间列表)(3) 管理空间节点、文件夹结构 (4) 读取/搜索文档内容 (5) 编辑操作智能表 (6) 编辑操作在线文档 (7) 文件管理(重命名、移动、删除、复制、导入导出)(8) 网页剪藏、本地文件/html/文档上云。

↓ 134.9万★ 312u_b0de8114
Excel / XLSX办公效率

创建、检查和编辑 Microsoft Excel 工作簿及 XLSX 文件,支持可靠的公式、日期、类型、格式、重算及模板保留功能。

↓ 21.7万★ 452Iván
Word / DOCX办公效率

创建、检查和编辑 Microsoft Word 文档及 DOCX 文件,支持样式、编号、修订记录、表格、分节符及兼容性检查等功能。

↓ 21.6万★ 540Iván
Gog办公效率

Google Workspace 命令行工具,支持 Gmail、日历、云端硬盘、通讯录、表格和文档。

↓ 20.6万★ 950Peter Steinberger
PDF和图片文字提取办公效率

从图片或 PDF 文档中识别并提取文字内容,支持多种图片格式和 PDF 文件,自动判断是否包含文字并保留原始格式输出结构化结果;v2.1 采用零额外依赖方案:扫描版 PDF 自动渲染为图片交由 AI 视觉识别(无需 tesseract/rapidocr)、表格用 pymupdf 内置 find_tables 结构化提取(无需 pdfplumber)、批量处理目录(PDF+图片一次性提取);当用户需要从图片或 PDF 提取文字、进行 OCR 识别、处理含文字的文档、提取 PDF 表格、批量处理文件夹或转换为可编辑文本时使用。该skill能力来自RedFoxHub,官网:https://redfox.hk/skills。

↓ 17.0万★ 183user_5f9c21aa
ppt-generator-skill办公效率

智能 PPT 生成助手。根据用户描述的主题、行业、风格,自动生成漂亮的 PPT 文件。支持所有行业(商务、教育、科技、医疗、金融、创意等),支持中英文双语,支持用户提供的模板或 AI 自动配色。触发词:做PPT、生成PPT、制作幻灯片、make ppt、create presentation、帮我做个PPT。

↓ 15.6万★ 301user_3b34947d
kdocs skill办公效率

操作金山文档(WPS 云文档 / Kdocs / 365.kdocs.cn / www.kdocs.cn)云文档的官方 Skill。核心能力覆盖云端新建、读取、编辑、搜索、分享、整理在线文档(智能文档、Word、Excel、PDF、PPT、演示文稿、智能表格、多维表格)及个人知识库。当用户的任务涉及云文档操作时使用,包括但不限于:写周报/日报/工作汇报、处理合同/发票、创建报名表/登记表、网页剪藏、接龙转表格、信息收集、文档总结与内容生成、改写仿写、翻译、AI PPT生成、PDF拆分导出、标签分类归档、收藏管理、碎片笔记整理、表格美化、回收站还原、知识库管理。

↓ 15.5万★ 123user_5ea84866
Nano Pdf办公效率

用自然语言指令改 PDF 指定页的小工具。

↓ 13.5万★ 293Peter Steinberger

ToBeWin 的其他技能

数据月份:2026-09 · 下载/星标/安装数聚合自公开技能注册库(ClawHub、SkillHub),按月更新。口径说明见数据方法。