# Send Email

> Send emails via SMTP with support for HTML formatting, file attachments, and email templates. Use when users ask to: (1) Send an email, (2) Email someone, (3) Send a notification, (4) Use email templates, or (5) Send files via email.

- **Type:** Skill
- **Install:** `agentstack add skill-wangyendt-wayne-skills-send-email`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [wangyendt](https://agentstack.voostack.com/s/wangyendt)
- **Installs:** 0
- **Category:** [Communication](https://agentstack.voostack.com/c/communication)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [wangyendt](https://github.com/wangyendt)
- **Source:** https://github.com/wangyendt/wayne-skills/tree/main/send-email

## Install

```sh
agentstack add skill-wangyendt-wayne-skills-send-email
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# Send Email

Send emails via SMTP using Python with support for plain text, HTML formatting, file attachments, and template-based emails.

## Key Features

- **Default Sender Email**: Automatically uses `agent_skill_test@126.com` when no sender is specified
- **Automatic Markdown to HTML**: Detects Markdown content and converts to beautifully styled HTML
- **Multiple Email Providers**: Supports Gmail, Outlook, QQ Mail, 163/126 Mail, and custom SMTP
- **File Attachments**: Attach multiple files to emails
- **Email Templates**: Use template files with variable substitution

## Interactive Email Sending Flow

This skill guides you through the email sending process step by step.

### Step 1: Collect Basic Email Information

Ask the user for the following required information. If any is missing, prompt the user to provide it:

| Information | Description | Example |
|-------------|-------------|---------|
| **Recipient** (`--to`) | Email address to send to | `user@example.com` |
| **Subject** (`--subject`) | Email subject line | `Monthly Report` |
| **Content** (`--content`) | Email body text or HTML | `Hello, here is your report.` |

**IMPORTANT - Default Sender Email Behavior**:

**If the user does NOT specify a sender email in their initial request, AUTOMATICALLY use `agent_skill_test@126.com` as the default sender. DO NOT ask the user which email to send from.**

Only ask the user for a different sender email if they explicitly mention wanting to use their own email address.

When using the default `agent_skill_test@126.com`, proceed directly to Step 2 and ask for the 126 email authorization code.

### Step 2: Identify Email Provider and Collect Credentials

Based on the sender's email address domain, identify the email provider and request the appropriate credentials.

#### Email Provider Detection

```
@gmail.com, @googlemail.com   → Gmail
@outlook.com, @hotmail.com, @live.com, @office365.com → Outlook/Office 365
@qq.com, @vip.qq.com          → QQ Mail
@163.com, @126.com            → NetEase Mail
@aliyun.com, @aliyun-inc.com  → Aliyun Mail
@sendgrid.net, @*.sendgrid.net → SendGrid
@*.mailgun.org                → Mailgun
Other domains                  → Custom SMTP (ask for server, port, username, password)
```

#### Provider-Specific Credential Requirements

**Gmail (@gmail.com, @googlemail.com)**
- **Password Type**: App Password (NOT account password)
- **Prerequisite**: Two-factor authentication (2FA) must be enabled
- **How to get App Password**:
  1. Go to https://myaccount.google.com/apppasswords
  2. Sign in to your Google Account
  3. Select "Mail" and "Other (Custom name)" → Enter a name like "SMTP Script"
  4. Click "Generate" → Copy the 16-character password
- **SMTP Server**: `smtp.gmail.com`
- **Port**: `587` (TLS) or `465` (SSL)
- **Username**: Your full Gmail address

**Outlook / Office 365 (@outlook.com, @hotmail.com, @live.com, @office365.com)**
- **Password Type**: Account password (same as web login)
- **SMTP Server**: `smtp.office365.com`
- **Port**: `587` (TLS)
- **Username**: Your full Outlook/Office 365 email address

**QQ Mail (@qq.com, @vip.qq.com)**
- **Password Type**: SMTP Authorization Code (NOT account password)
- **How to get Authorization Code**:
  1. Login to QQ Mail at https://mail.qq.com
  2. Click "Settings" (设置) → "Account" (账户)
  3. Find "POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV Service"
  4. Open "POP3/SMTP Service" or "IMAP/SMTP Service"
  5. Click "Generate Authorization Code" (生成授权码)
  6. Verify identity via SMS → Copy the generated code
- **SMTP Server**: `smtp.qq.com`
- **Port**: `587` (TLS) or `465` (SSL)
- **Username**: Your full QQ email address

**NetEase 163 Mail (@163.com)**
- **Password Type**: SMTP Authorization Code (NOT account password)
- **How to get Authorization Code**:
  1. Login to 163 Mail at https://mail.163.com
  2. Click "Settings" (设置) → "POP3/SMTP/IMAP"
  3. Click "Open" next to "IMAP/SMTP Service"
  4. Verify identity → Click "Get Authorization Code" (获取授权码)
  5. Copy the 16-character authorization code
- **SMTP Server**: `smtp.163.com`
- **Port**: `465` (SSL) or `994` (IMAP)
- **Username**: Your full 163 email address

**NetEase 126 Mail (@126.com)**
- **Password Type**: SMTP Authorization Code (NOT account password)
- **How to get Authorization Code**:
  1. Login to 126 Mail at https://mail.126.com
  2. Click "Settings" (设置) → "POP3/SMTP/IMAP"
  3. Enable "IMAP/SMTP Service"
  4. Copy the authorization password displayed
- **SMTP Server**: `smtp.126.com`
- **Port**: `465` (SSL) or `25` (SSL)
- **Username**: Your full 126 email address

**SendGrid**
- **Password Type**: API Key (as password)
- **How to get API Key**:
  1. Login to SendGrid at https://app.sendgrid.com
  2. Go to Settings → API Keys
  3. Click "Create API Key"
  4. Set permissions → Click "Create & View"
  5. Copy the API key (only shown once)
- **SMTP Server**: `smtp.sendgrid.net`
- **Port**: `587` (TLS) or `465` (SSL)
- **Username**: `apikey` (literally this string)

**Mailgun**
- **Password Type**: SMTP credentials from dashboard
- **How to get Credentials**:
  1. Login to Mailgun at https://app.mailgun.com
  2. Go to Sending → Domains
  3. Select your domain
  4. Copy SMTP username and password from the page
- **SMTP Server**: `smtp.mailgun.org`
- **Port**: `587` (TLS)
- **Username**: From Mailgun dashboard

**Custom SMTP (Other domains)**
Ask the user to provide:
- SMTP Server Address
- SMTP Port
- Username
- Password

### Step 3: Auto-detect and Handle Markdown Content

The script automatically detects if the email content is in Markdown format by looking for common patterns:
- Headers (`#`, `##`, `###`)
- Bold/italic text (`**bold**`, `*italic*`)
- Lists (`- item` or `1. item`)
- Code blocks (```)
- Links (`[text](url)`)

If Markdown is detected, the content is automatically converted to beautifully styled HTML with:
- Professional typography and spacing
- Color-coded headers
- Styled tables and code blocks
- Responsive design for email clients

**You don't need to manually specify `--content-type html` for Markdown content** - it's handled automatically!

### Step 4: Collect Optional Information (if needed)

- `--from-name`: Display name for sender (e.g., "John Doe")
- `--content-type html`: For HTML formatted emails (defaults to plain text, but auto-converts Markdown)
- `--attach`: File path(s) to attach (can specify multiple)
- `--template`: Use template file instead of content
- `--template-vars`: JSON string of template variables

### Step 5: Confirm and Send

Before sending, confirm with the user:

```
Ready to send:
From: [Sender Email]
To: [Recipient Email]
Subject: [Subject]
Content Type: [Plain/HTML]
Attachments: [List of attachments or None]

Proceed to send? (y/n)
```

If confirmed, execute the send_email.py script with all collected parameters.

## Example Conversations

### Example 1: Basic Gmail Email

**User**: Send an email to john@example.com with subject "Hello"

**Skill**: I can help you send that email. I need a few more details:

1. **Content**: What should the email body contain?
2. **Sender Email**: What email address should I send from?

**User**: The content is "Hi John, just saying hello!" and send from myemail@gmail.com

**Skill**: I detected you're using Gmail. For Gmail, you need an App Password (not your regular password).

To get your App Password:
1. Go to https://myaccount.google.com/apppasswords
2. Sign in and create an App Password for "Mail"
3. Copy the 16-character password

**Please provide your Gmail App Password:**

**User**: abcd efgh ijkl mnop

**Skill**: Ready to send:
- From: myemail@gmail.com
- To: john@example.com
- Subject: Hello
- Content: Hi John, just saying hello!

Proceed to send? (y/n)

---

### Example 2: Markdown Content with Default Sender

**User**: 发一封邮件给 manager@company.com,主题是"AR眼镜行业分析",内容是 [用户提供的 Markdown 报告]

**Skill**: 我来帮您发送这封邮件。检测到您没有指定发件人邮箱,我将使用默认邮箱 `agent_skill_test@126.com` 发送。

同时,我发现您的内容是 Markdown 格式,将自动转换为美观的 HTML 格式,让报告更易读。

为了使用 126 邮箱发送,我需要您提供 **SMTP 授权码**。

获取授权码步骤:
1. 登录 126 邮箱 → 设置 → POP3/SMTP/IMAP
2. 启用 "IMAP/SMTP 服务"
3. 复制显示的授权密码

**请提供 agent_skill_test@126.com 的授权码:**

**User**: [提供授权码]

**Skill**: 准备发送邮件:
- 发件人: agent_skill_test@126.com
- 收件人: manager@company.com
- 主题: AR眼镜行业分析
- 格式: Markdown → HTML (自动转换)
- 内容预览: 包含标题、列表、表格等格式化内容

确认发送? (y/n)

---

### Example 3: Default Sender with Missing Content

**User**: 发邮件给 user@company.com，主题是项目报告

**Skill**: 我需要收集邮件内容：

**邮件正文是什么？**

**User**: 项目已完成，所有里程碑都已达成。

**Skill**: 我将使用默认邮箱 `agent_skill_test@126.com` 发送。

为了使用 126 邮箱发送，我需要您提供 **SMTP 授权码**。

获取授权码步骤：
1. 登录 126 邮箱 → 设置 → POP3/SMTP/IMAP
2. 启用 "IMAP/SMTP 服务"
3. 复制显示的授权密码

**请提供 agent_skill_test@126.com 的授权码：**

**User**: [提供授权码]

**Skill**: 准备发送邮件：
- 发件人: agent_skill_test@126.com
- 收件人: user@company.com
- 主题: 项目报告
- 内容: 项目已完成，所有里程碑都已达成。

确认发送？(y/n)

---

### Example 4: User Specifies Custom Sender Email

**User**: Send a report to boss@company.com from myname@outlook.com about Q4 results, with attachment /home/user/q4_report.pdf

**Skill**: I'll help you send that email. Please provide the email content:

**What should the email say about the Q4 results?**

**User**: Please find attached the Q4 financial report. Let me know if you have any questions.

**Skill**: I see you're using Outlook. You'll need your Outlook account password (same as web login).

**Please provide your Outlook password:**

**User**: mypassword123

**Skill**: Ready to send:
- From: myname@outlook.com
- To: boss@company.com
- Subject: Q4 results
- Content: Please find attached the Q4 financial report. Let me know if you have any questions.
- Attachment: /home/user/q4_report.pdf

Proceed to send? (y/n)

---

### Example 5: Custom SMTP

**User**: Send email to test@domain.com from my@domain.com

**Skill**: I need to gather some information:

1. **Subject**: What is the email subject?
2. **Content**: What is the email body?

**User**: Subject is Test Email, content is Hello World

**Skill**: Since you're using a custom domain (my@domain.com), I'll need your SMTP configuration:

1. **SMTP Server**: What is your SMTP server address?
2. **SMTP Port**: What port should I use?
3. **Username**: What is your SMTP username?
4. **Password**: What is your SMTP password?

**User**: Server is smtp.mydomain.com, port 587, username is my@domain.com, password is secret

**Skill**: Ready to send:
- From: my@domain.com
- To: test@domain.com
- Subject: Test Email
- Content: Hello World
- SMTP Server: smtp.mydomain.com:587

Proceed to send? (y/n)

## Script Command Reference

Once all information is collected, execute the script with appropriate parameters:

### Basic Command

```bash
python3 scripts/send_email.py \
  --to recipient@example.com \
  --subject "Email Subject" \
  --content "Email body content" \
  --smtp-server smtp.gmail.com \
  --smtp-port 587 \
  --username your@email.com \
  --password your-password-or-app-password
```

### HTML Email

```bash
python3 scripts/send_email.py \
  --to recipient@example.com \
  --subject "Email Subject" \
  --content "HelloHTML content" \
  --content-type html \
  --smtp-server smtp.gmail.com \
  --smtp-port 587 \
  --username your@email.com \
  --password your-password
```

### Email with Attachments

```bash
python3 scripts/send_email.py \
  --to recipient@example.com \
  --subject "Email Subject" \
  --content "Email body" \
  --attach /path/to/file1.pdf \
  --attach /path/to/file2.csv \
  --smtp-server smtp.gmail.com \
  --smtp-port 587 \
  --username your@email.com \
  --password your-password
```

### Email with Template

```bash
python3 scripts/send_email.py \
  --to recipient@example.com \
  --subject "Email Subject" \
  --template assets/simple-notification.html \
  --template-vars '{"title":"Notification","message":"Your report is ready!"}' \
  --content-type html \
  --smtp-server smtp.gmail.com \
  --smtp-port 587 \
  --username your@email.com \
  --password your-password
```

### SSL Connection (instead of TLS)

```bash
python3 scripts/send_email.py \
  --to recipient@example.com \
  --subject "Email Subject" \
  --content "Email body" \
  --smtp-server smtp.gmail.com \
  --smtp-port 465 \
  --use-ssl \
  --username your@email.com \
  --password your-password
```

## SMTP Server Configuration Reference

| Provider | SMTP Server | Port | Encryption | Password Type | Username |
|----------|-------------|------|------------|---------------|----------|
| Gmail | smtp.gmail.com | 587 | TLS | App Password | Full email |
| Gmail | smtp.gmail.com | 465 | SSL | App Password | Full email |
| Outlook | smtp.office365.com | 587 | TLS | Account Password | Full email |
| QQ Mail | smtp.qq.com | 587 | TLS | Authorization Code | Full email |
| QQ Mail | smtp.qq.com | 465 | SSL | Authorization Code | Full email |
| 163 Mail | smtp.163.com | 465 | SSL | Authorization Code | Full email |
| 163 Mail | smtp.163.com | 994 | SSL | Authorization Code | Full email |
| 126 Mail | smtp.126.com | 465 | SSL | Authorization Code | Full email |
| 126 Mail | smtp.126.com | 25 | SSL | Authorization Code | Full email |
| SendGrid | smtp.sendgrid.net | 587 | TLS | API Key | `apikey` |
| SendGrid | smtp.sendgrid.net | 465 | SSL | API Key | `apikey` |
| Mailgun | smtp.mailgun.org | 587 | TLS | SMTP Password | From dashboard |

## Installation

Before using this skill, install the required Python dependencies:

```bash
pip install -r requirements.txt
```

This installs the `markdown` library (version ≥3.4.0) which is required for automatic Markdown to HTML conversion.

## Resources

### scripts/send_email.py

Main Python script for sending emails. Supports:
- Plain text and HTML content
- Multiple file attachments
- Email templates with variable substitution
- TLS and SSL encryption
- Custom sender names

### references/smtp-servers.md

Common SMTP server configurations including Gmail, Outlook, 126, QQ, 163, SendGrid, Mailgun, and Aliyun.

### assets/

Email templates:
- `simple-notification.html` - Basic notification template
- `report-summary.html` - Professional report template with metrics grid

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [wangyendt](https://github.com/wangyendt)
- **Source:** [wangyendt/wayne-skills](https://github.com/wangyendt/wayne-skills)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-wangyendt-wayne-skills-send-email
- Seller: https://agentstack.voostack.com/s/wangyendt
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
