🎁 Get the FREE AI Skills Starter GuideSubscribe →
BytesAgainBytesAgain
🦀 ClawHub

Send Email Tool

by @flyingtimes

邮件发送工具。配置 SMTP 发件人后,通过脚本发送纯文本或 HTML 邮件,支持附件、抄送、密送。在需要发送邮件通知、报告、自动化邮件时触发。

Versionv2.5.0
Downloads1,319
TERMINAL
clawhub install send-email-tool

📖 About This Skill


name: send-email description: 邮件发送工具。配置 SMTP 发件人后,通过脚本发送纯文本或 HTML 邮件,支持附件、抄送、密送。在需要发送邮件通知、报告、自动化邮件时触发。

Send Email

通过 SMTP 发送邮件的工具,支持 keyring 密钥管理。

功能

  • ✅ 支持 SMTP 邮件发送(Gmail、QQ 邮箱、163 邮箱等)
  • ✅ 支持纯文本和 HTML 格式邮件
  • 支持模板渲染(使用 --template 参数,支持自定义模板)
  • 支持内嵌图片(图片直接显示在邮件正文中,不是链接)
  • 自动检测 Markdown 格式(含图片自动嵌入)
  • ✅ 支持附件(文档、图片等)
  • ✅ 支持抄送(CC)和密送(BCC)
  • ✅ 配置持久化,避免重复输入
  • 密钥管理:支持 keyring 安全存储密码(推荐)
  • 密钥管理

    ⚠️ 重要:密码安全

    本技能强制使用 keyring 管理发件人邮箱和密码,避免敏感信息暴露在命令行或上下文中。

    安装 keyring

    pip install keyring
    

    如果 keyring 未安装,脚本会自动使用备用存储方案(base64 编码的本地文件)。

    首次使用:保存发件人邮箱

    在发送邮件前,必须先保存发件人邮箱到 keyring:

    # 保存发件人邮箱(会提示输入)
    python3 send_email.py username --save --email your-email@gd.chinamobile.com

    或只运行 --save,然后交互输入

    python3 send_email.py username --save

    保存密码

    # 保存密码(会提示输入)
    python3 send_email.py password --save
    

    删除密钥

    # 删除发件人邮箱
    python3 send_email.py username --delete

    删除密码

    python3 send_email.py password --delete

    查看密钥状态

    # 查看发件人邮箱
    python3 send_email.py username

    查看密码状态

    python3 send_email.py password

    ⚠️ 安全提醒

  • 不要在命令行参数中传递邮箱或密码
  • 不要使用 --email 参数直接指定发件人
  • 始终通过 username --savepassword --save 命令管理密钥
  • 邮箱和密码会自动从 keyring 读取,无需每次输入
  • 默认邮箱:user@gd.chinamobile.com

  • 快速开始

    0. 安装依赖(可选)

    推荐安装 markdown 库以支持 Markdown 自动转换:

    pip install markdown keyring
    

    如果不安装 markdown 库,脚本仍可正常发送纯文本和 HTML 邮件,但无法自动转换 Markdown。

    1. 首次配置

    cd $CLAWD/skills/send-email/scripts

    配置 SMTP 服务器(中国移动邮箱默认配置)

    python3 send_email.py smtp --host smtp.gd.chinamobile.com --port 465 --no-tls

    配置发件人名称

    python3 send_email.py sender --name "Your Name"

    保存发件人邮箱到 keyring

    python3 send_email.py username --save --email your-email@gd.chinamobile.com

    查看当前配置

    python3 send_email.py config

    中国移动邮箱默认配置:

    | 配置项 | 值 | |-------|-----| | SMTP 服务器 | smtp.gd.chinamobile.com | | 端口 | 465 (SSL) | | TLS | ❌ (使用 SSL) | | 默认邮箱 | user@gd.chinamobile.com |

    重要提示: 如果使用 Gmail,需要生成「应用专用密码」(App Password),而不是使用账户密码。


    2. 发送邮件

    #### 首次使用:保存密码

    python3 send_email.py password --save
    

    按提示输入密码

    #### 基础发送(纯文本)

    python3 send_email.py send \
      --to recipient@example.com \
      --subject "邮件主题" \
      --body "邮件正文内容"
    

    #### HTML 邮件

    python3 send_email.py send \
      --to recipient@example.com \
      --subject "HTML 邮件" \
      --body "

    标题

    正文内容

    " \ --html

    #### 带附件的邮件

    python3 send_email.py send \
      --to recipient@example.com \
      --subject "带附件的邮件" \
      --body "请查看附件" \
      --attachments "/path/to/file1.pdf" "/path/to/file2.png"
    

    #### 抄送和密送

    python3 send_email.py send \
      --to recipient@example.com \
      --cc cc1@example.com cc2@example.com \
      --bcc bcc@example.com \
      --subject "多人邮件" \
      --body "邮件正文"
    

    #### 自动检测 Markdown + 内嵌图片(最强推荐)⭐⭐⭐

    功能: 自动检测 Markdown 格式,自动提取并内嵌图片,无需手动指定!

    python3 send_email.py send \
      --to recipient@example.com \
      --subject "Markdown 邮件(自动检测图片)" \
      --body "# 标题\n\n!图片说明\n\n这是正文内容"
    

    工作流程: 1. 脚本自动检测 Markdown 格式 2. 自动提取 Markdown 中的图片路径(支持 !alt 语法) 3. 自动将 Markdown 转换为 HTML 4. 自动将图片转换为 CID 引用(src="cid:image") 5. 图片直接显示在邮件正文中

    示例:发送包含多张图片的 Markdown

    python3 send_email.py send \
      --to recipient@example.com \
      --subject "产品报告" \
      --body "$(cat report.md)"
    

    其中 report.md 内容:

    # 产品更新报告

    新功能展示

    这是第一个功能截图:

    !功能1

    这是第二个功能截图:

    !功能2

    总结

    如有问题,请联系我们。

    结果: 收件人会收到一封格式美观的 HTML 邮件,图片直接显示在正文中!


    #### 手动指定内嵌图片

    功能: 图片直接显示在邮件正文中,不是链接。使用 CID(Content-ID)技术,兼容所有主流邮件客户端。

    python3 send_email.py send \
      --to recipient@example.com \
      --subject "带内嵌图片的邮件" \
      --html \
      --body "

    标题

    正文内容

    " \ --inline-images "/path/to/image.png"

    工作原理: 1. 脚本会自动将 HTML 中的图片路径替换为 CID 引用(src="cid:filename") 2. 图片作为内嵌资源添加到邮件中 3. 邮件客户端会直接显示图片,不需要点击链接

    多张图片示例:

    python3 send_email.py send \
      --to recipient@example.com \
      --subject "产品截图" \
      --html \
      --body "

    产品展示


    " \ --inline-images "/path/to/screenshot1.png" "/path/to/screenshot2.png"

    重要提示:

  • --inline-images 必须配合 --html 参数使用(如未指定,会自动启用)
  • 图片路径必须与 HTML 中的 src 属性完全一致
  • 支持 PNG、JPG、JPEG、GIF、WebP 格式
  • CID 会自动使用文件名(去掉扩展名),例如 image.pngcid:image

  • 参数说明

    发送命令 (send)

    | 参数 | 说明 | 必填 | |------|------|------| | --to | 收件人邮箱 | ✅ | | --to-name | 收件人名称 | ❌ | | --subject | 邮件主题 | ✅ | | --body | 邮件正文 | ✅ | | --html | 使用 HTML 格式 | ❌ | | --template | 使用指定模板渲染邮件(模板文件名) | ❌ | | --title | 邮件标题(模板中使用,默认:"邮件摘要") | ❌ | | --attachments | 附件路径(可多个) | ❌ | | --inline-images | 内嵌图片路径(可多个,仅 HTML 模式) | ❌ | | --cc | 抄送邮箱(可多个) | ❌ | | --bcc | 密送邮箱(可多个) | ❌ |

    发件人邮箱管理命令 (username)

    | 参数 | 说明 | |------|------| | --save | 保存发件人邮箱到 keyring(会提示输入) | | --delete | 删除保存的发件人邮箱 |

    密码管理命令 (password)

    | 参数 | 说明 | |------|------| | --save | 保存密码到 keyring(会提示输入) | | --delete | 删除保存的密码 |


    配置文件

    配置文件保存在:~/.send_email_config.json

    示例配置:

    {
      "smtp": {
        "host": "smtp.gd.chinamobile.com",
        "port": 465,
        "use_tls": false
      },
      "sender": {
        "name": "Your Name"
      }
    }
    

    注意: 发件人邮箱通过 username --save 命令存储在 keyring 中,不在配置文件中。


    完整示例

    示例 1: 发送 Markdown 邮件(自动检测并内嵌图片)⭐

    创建一个 Markdown 文件 newsletter.md

    # 今日新闻摘要

    科技头条

    AI 技术持续突破,以下是最新进展:

    !AI 演示

    产品更新

    新功能界面展示:

    !新功能


    如需了解更多,请访问我们的官网。

    发送邮件(超级简单,无需指定任何图片参数!):

    python3 send_email.py send \
      --to recipient@example.com \
      --subject "今日新闻摘要" \
      --body "$(cat newsletter.md)"
    

    结果: 脚本会自动: 1. 检测到 Markdown 格式 2. 提取 2 张图片路径 3. 转换为 HTML 并替换图片为 CID 引用 4. 内嵌图片到邮件中 5. 发送格式美观的 HTML 邮件


    示例 2: 发送带内嵌图片的 HTML 邮件(手动指定)

    假设你有两张产品截图:

    cd ~/clawd/skills/send-email/scripts

    准备 HTML 内容

    cat > email_content.html << 'EOF'

    产品更新通知

    大家好!

    这是我们最新的产品截图:

    第二个功能展示:

    如有问题,请随时联系我们!

    Best regards,
    产品团队

    EOF

    发送邮件

    python3 send_email.py send \ --to recipient@example.com \ --subject "产品更新 - 新功能截图" \ --html \ --body "$(cat email_content.html)" \ --inline-images "/Users/clark/Pictures/screenshot1.png" "/Users/clark/Pictures/screenshot2.png"

    结果: 收件人打开邮件后,图片会直接显示在邮件正文中,不需要点击链接。


    示例 3: 手动指定内嵌图片(HTML 模式)

    假设你有现成的 HTML 内容:

    python3 send_email.py send \
      --to recipient@example.com \
      --subject "产品截图" \
      --html \
      --body "

    产品展示

    " \ --inline-images "/path/to/image.png"

    何时使用手动指定:

  • 已有现成的 HTML 内容
  • 不想使用 Markdown 转换
  • 需要精确控制 CID 引用

  • 示例 4: 结合 X 推文技能(自动工作流)⚡

    假设你已经使用 crawl-from-xtranslate 技能抓取并翻译了 X 推文,结果保存在 posts_zh.md

    现在发送邮件(一键搞定!):

    python3 send_email.py send \
      --to your-email@example.com \
      --subject "今日 X 推文摘要" \
      --body "$(cat /path/to/posts_zh.md)"
    

    完整工作流:

    # 步骤 1: 抓取 X 推文
    crawl-from-x 抓取

    步骤 2: 翻译为中文

    使用 translate 技能翻译最新的文件

    步骤 3: 发送邮件(自动检测 Markdown + 图片)

    python3 send_email.py send \ --to your-email@example.com \ --subject "今日 X 推文摘要" \ --body "$(cat $CLAWD/skills/crawl-from-x/results/*_zh.md)"

    自动化脚本:

    创建 send-x-news.sh

    #!/bin/bash
    cd ~/clawd/skills/crawl-from-x/scripts
    python3 craw_hot.py crawl

    LATEST_MD=$(ls -t ~/clawd/skills/crawl-from-x/results/*.md | head -1) python3 ~/clawd/skills/send-email/scripts/send_email.py send \ --to your-email@example.com \ --subject "$(date +'%Y-%m-%d') X 推文摘要" \ --body "$(cat $LATEST_MD)"

    添加到 cron:

    crontab -e
    

    添加:每天早上 8:00 执行

    0 8 * * * ~/clawd/skills/send-email/scripts/send-x-news.sh


    模板功能

    使用模板渲染邮件

    使用 --template 参数可以让邮件内容使用指定的模板进行渲染,提供更美观的视觉效果。

    python3 send_email.py send \
      --to recipient@example.com \
      --subject "今日 X 推文摘要" \
      --body "$(cat posts_zh.md)" \
      --template default \
      --title "X 帖子摘要"
    

    参数说明:

  • --template:模板文件名(不含 .html 扩展名)
  • - 默认模板:default(仿照 x.com 样式) - 模板位置:templates/ 目录
  • --title:邮件标题(模板中使用,默认:"邮件摘要")
  • 默认模板(default)

    send-email 技能内置了一个名为 default 的默认模板,具有以下特点:

  • 设计风格:现代、简约、商务、大气
  • 视觉参考:仿照 x.com 网页样式
  • 布局:卡片式布局,圆角边框
  • 配色
  • - 背景:白色(#ffffff) - 主要文字:深色(#0f1419) - 次要文字:灰色(#536471) - 链接:蓝色(#1d9bf0) - 边框:浅灰色(#eff3f4)
  • 响应式:适配移动端和桌面端
  • 支持内容:文字、图片、链接
  • 模板变量:

  • {{title}}:邮件标题(通过 --title 参数设置)
  • {{subtitle}}:副标题(自动生成时间戳)
  • {{content}}:邮件正文内容
  • 自定义模板

    如果默认模板不满足需求,可以创建自定义模板:

    1. 在 templates/ 目录下创建新的 HTML 文件 2. 使用 {{title}}{{subtitle}}{{content}} 作为变量占位符 3. 使用时指定模板名称:

    python3 send_email.py send \
      --to recipient@example.com \
      --subject "每周报告" \
      --body "$(cat report.md)" \
      --template my-template
    

    模板示例: templates/default.html

    
    
    
        
        {{title}}
        
    
    
        

    {{title}}

    {{subtitle}}

    {{content}}

    模板 + Markdown 自动检测

    模板功能与 Markdown 自动检测完全兼容:

    # 检测 Markdown → 转换为 HTML → 应用模板 → 发送
    python3 send_email.py send \
      --to recipient@example.com \
      --subject "X 推文摘要" \
      --body "$(cat posts_zh.md)" \
      --template default
    

    处理流程: 1. 检测 Markdown 格式 2. 提取并内嵌图片 3. 转换为 HTML 4. 应用模板 5. 发送邮件

    模板目录结构

    send-email/
    ├── scripts/
    │   └── send_email.py
    └── templates/
        ├── default.html       # 默认模板(仿照 x.com)
        ├── my-template.html   # 自定义模板 1
        └── weekly.html       # 自定义模板 2
    


    使用建议

    1. 密钥管理(强制): 首次使用前必须运行 python send_email.py username --savepython send_email.py password --save 分别保存发件人邮箱和密码。这些信息会安全存储在 keyring 中,不会暴露在命令行或上下文中。

    2. 不要传递密钥: 发送邮件时不要使用 --email--password 参数,这些信息会自动从 keyring 读取。这是为了保护密钥安全。

    3. 中国移动邮箱: 默认配置为 smtp.gd.chinamobile.com:465(SSL),默认发件人邮箱为 user@gd.chinamobile.com

    4. Markdown 自动检测(推荐): - 脚本会自动检测 Markdown 格式(标题、粗体、列表、图片等) - 自动提取 Markdown 中的图片并内嵌到邮件中 - 无需手动指定 --inline-images--html 参数 - 如果不想自动转换,使用 --html 参数强制指定为纯 HTML 模式

    5. 内嵌图片: - 支持 Markdown 语法:!alt - 支持 HTML 语法: - 图片会自动转换为 CID 引用,直接显示在邮件正文中 - 建议压缩图片大小(每张 < 500KB),避免邮件过大被拒收 - CID 使用文件名(去掉扩展名),例如 myphoto.pngcid:myphoto

    6. 图片路径: - 使用绝对路径(推荐) - 确保图片文件存在且可读 - 跳过 http://https:// 开头的图片链接(外链)

    7. 附件路径: 使用绝对路径或相对于执行目录的路径

    8. 测试: 首次使用时,建议先发送测试邮件给自己

    9. keyring 备用方案: 如果 keyring 不可用,密钥会保存在 ~/.send_email_password~/.send_email_username(base64 编码),文件权限为 600。注意这不是加密,仅避免明文存储。

    安全流程

    1. 首次配置(中国移动邮箱):
       - python send_email.py smtp --host smtp.gd.chinamobile.com --port 465 --no-tls
       - python send_email.py sender --name "Your Name"
       - python send_email.py username --save --email your-email@gd.chinamobile.com
       - python send_email.py password --save  ← 输入密码

    2. 后续发送: - python send_email.py send --to to@example.com --subject "..." --body "..." 邮箱和密码自动从 keyring 读取


    技术说明

    Markdown 自动检测

    脚本会检测以下 Markdown 语法:

  • 标题:# 标题
  • 粗体:粗体
  • 代码块: `
  • 列表:- 列表项1. 列表项
  • 链接:文本
  • 图片:!alt
  • 检测到以上任一语法,会自动转换为 HTML 格式。

    图片自动提取

    支持两种语法:

    Markdown 语法:

    !图片说明
    

    HTML 语法:

    
    

    脚本会: 1. 自动提取所有图片路径 2. 跳过 http://https:// 开头的链接 3. 将本地图片路径转换为 CID 引用 4. 内嵌到邮件中

    CID 工作原理

    1. 图片作为 MIME part 添加到邮件 2. 每张图片分配 Content-ID(例如 cid:myimage) 3. HTML 中使用 引用 4. 邮件客户端解析并直接显示图片

    支持的图片格式

  • PNG
  • JPG / JPEG
  • GIF
  • WebP
  • 依赖项

  • 必须: Python 3.7+
  • 推荐: keyring(密钥管理)
  • 推荐: markdown(Markdown 自动转换)
  • 安装依赖:

    pip install keyring markdown
    

    邮件大小限制

  • 大多数邮件服务器限制:10-25 MB
  • 建议:每张图片 < 500KB
  • 建议:总邮件大小 < 5 MB
  • 如果邮件过大,可能被拒收或放入垃圾邮件。