ToBeWin

Email Writer

オフィス効率化v1.0.5
作者:ToBeWin✓ SkillHub 認証済み更新日 2026-07-03email-writer@user_9fe56694/email-writer
メール処理

AlphaMoatによると、2026-09時点でEmail Writerのダウンロード数は1,480、スター数は1で、AIスキル全体5,078件中4,782位、オフィス効率化では435件中392位です。

インストール数
119
ダウンロード数
1480
スター数
1
総合順位
#4,782
全体の上位 95% · オフィス効率化の上位 91%
プラットフォームインストール数ダウンロード数スター数コメント
ClawHub ↗3437--
SkillHub ↗11914801—

プラットフォームごとに集計方法と集計時点が異なります。

このスキルでできること

Gmail、Outlook、QQ Mail、163 Mail に対応します。特定の宛先への送信を利用者が明確に依頼した場合に使います。ブラウザー操作前に宛先、件名、要点、文体、メールへのログイン状態を確認します。本文と添付ファイルはブラウザー経由で選択したサービスへ送信されます。中国語と英語に対応し、認証コード、暗号化メール、一括送信は文書に記載された対応範囲外です。

資料公開日 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 原文

作者が公開した元のファイルをテキストのまま表示しています。AlphaMoat による編集や審査はしていません。リンクはクリックできません。コマンドは内容を確認してから実行してください。取得日 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オフィス効率化

Create, inspect, and edit Microsoft Excel workbooks and XLSX files with reliable formulas, dates, types, formatting, recalculation, and template preservation...

↓ 21.7万★ 452Iván
Word / DOCXオフィス効率化

Create, inspect, and edit Microsoft Word documents and DOCX files with reliable styles, numbering, tracked changes, tables, sections, and compatibility check...

↓ 21.6万★ 540Iván
Gogオフィス効率化

Google Workspace CLI for Gmail, Calendar, Drive, Contacts, Sheets, and Docs.

↓ 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)から月単位で集計しています。詳しくはデータの方法論をご覧ください。