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
累計下載
1480
星標
1
全站排名
#4,782
全站前 95% · 「辦公效率」前 91%
平台累計安裝累計下載星標評論
ClawHub ↗3437--
SkillHub ↗11914801—

各平台的計數口徑不同,統計時間不一致。

這個技能是做什麼的

支援 Gmail、Outlook、QQ 電子郵件和 163 電子郵件。僅在使用者明確要求向特定收件人寫信並傳送時觸發;瀏覽器操作前核對收件人、主題、要點、語氣和電子郵件登入狀態。郵件內文與附件會經瀏覽器傳送到所選服務商。支援中英文郵件;驗證碼、加密郵件和批次傳送不在文件支援範圍內。

資料釋出於 2026-10-26

可以用來做什麼

  • 在指定電子郵件中撰寫並傳送郵件

什麼時候用

  • 需要透過已登入的網頁電子郵件傳送郵件時

示例提示詞

以下是根據技能文件生成的示例,不代表實際執行結果。

幫我給指定收件人寫一封郵件。開始瀏覽器操作前,請先核對收件人、主題、要點、語氣和登入狀態。

使用條件

依據技能文件中的宣告整理,未經實際安裝或執行驗證。

鑑權說明
需要 OpenClaw v2026.3.22 或更高版本及瀏覽器存取。
配置要求
  • 郵件內容和附件會傳送到使用者選擇的郵件服務商;敏感內容請謹慎處理。

月度資料趨勢

累計下載1480
465101015552026-03 · 累計下載 5402026-05 · 累計下載 7712026-07 · 累計下載 9632026-09 · 累計下載 148026-0326-09
星標1
0122026-03 · 星標 12026-05 · 星標 12026-07 · 星標 12026-09 · 星標 126-0326-09

2026-09 起統計方法調整:同名技能按作者分別統計,並覆蓋全部技能。圖中虛線為調整前的月份,與之後的資料不直接比較,也不計算跨越調整的增長。 該技能有同名的其他版本,調整前的資料歸屬當前下載量最大的這一個。

月份累計下載環比星標
2026-091480—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萬★ 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),按月更新。口徑說明見資料方法。