邮件技能

基于SMTP协议实现多供应商邮件发送自动化,支持附件、HTML模板、TLS加密和投递状态追踪。

天轰穿

@thcjp

Install

$ openclaw skills install @thcjp/email-toolkit

功能说明: 本技能涵盖 化工作流场景 等核心能力。

Email

基于SMTP协议的邮件发送自动化Skill,围绕"配置-校验-投递-追踪"四个环节提供端到端的发信能力.

输入规范

参数名类型必填说明
inputstringEmail处理的输入数据或指令
optionsobject附加配置选项,如模式选择、格式偏好等
callback_urlstring异步处理完成后的回调通知URL

专业版专属特性

能力免费版付费版
基础功能支持支持
EmailSMTP邮件发送不支持支持
深度质量检查与CVE关联不支持支持
配置基线合规审计不支持支持
批量资产风险评分不支持支持
情报分析实时订阅与告警不支持支持

环境要求

运行环境

  • Agent平台: 支持SKILL.md的任意AI Agent(Claude Code / Cursor / Codex / Gemini CLI等)
  • 操作系统: Windows / macOS / Linux

依赖项

依赖项类型是否必需获取方式
LLM APIAPI必需由Agent内置LLM提供

API Key 配置

需要配置对应API Key,详见上文环境配置章节

可用性分类

  • 分类: MD+EXEC()

API Key配置方式:

export API_KEY="${API_KEY:?请设置环境变量}"

配置后需重启会话或开启新终端生效。API Key应妥善保管,避免泄露到版本控制系统.

零基础入门

  1. 确认运行环境满足依赖说明中的要求
  2. 在AI Agent对话中调用本技能,提供必要的输入参数
  3. 检查输出结果,根据需要进行后续处理

详细的输入输出格式请参考下方章节说明。

环境准备

凭据配置文件

在工作目录创建email_config.json:

{
  "smtp_server": "smtp.gmail.com",
  "smtp_port": 587,
  "username": "your-email@gmail.com",
  "password": "your-app-password",
  "sender_name": "自动化助手",
  "use_tls": true,
  "use_ssl": false
}

Gmail应用专用密码

Gmail禁止直接使用账号登录密码,必须使用应用专用密码:

  1. 在Google账号开启两步验证(2FA).
  2. 访问https://myaccount.google.com/security,进入"应用密码".
  3. 选择"邮件"应用生成16位应用专用密码,填入password字段.

环境变量注入(推荐用于生产)

export SMTP_SERVER=smtp.gmail.com
export SMTP_PORT=587
export EMAIL_USERNAME=your-email@gmail.com
export EMAIL_PASSWORD=your-app-password
export EMAIL_SENDER_NAME="自动化助手"

典型场景

场景一:日报报表投递

  • 输入:数据团队产出的daily_report.xlsx与收件人列表team@company.com.
  • 处理:读取报表文件,以附件形式投递,正文嵌入当日关键指标摘要(HTML表格).
  • 输出:收件人邮箱收到带附件的HTML邮件,投递结果返回message_id用于追踪.

场景二:告警通知推送

  • 输入:监控系统触发的告警JSON,包含级别、时间、指标值.
  • 处理:将告警级别映射为邮件主题前缀([P0]/[P1]),正文以红色高亮关键指标,投递至值班工程师邮箱.
  • 输出:值班工程师在30秒内收到带优先级标识的告警邮件.

场景三:营销批次触达

  • 输入:CSV格式的收件人清单(含姓名、定制化字段)与HTML邮件模板.
  • 处理:逐行解析CSV,变量替换后通过BCC方式批量投递,单批不超过服务商速率限制(如Gmail约100封/分钟).
  • 输出:完成批次投递统计,返回成功/失败计数与失败明细.

案例展示

案例1:发送带双附件的项目周报

python email_sender.py \
  --to "pm@company.com" \
  --cc "dev-leads@company.com" \
  --subject "[周报] 后端服务第28周交付总结" \
  --body "附件为本周交付物与缺陷清单,请于周五前确认。" \
  --attachment "weekly_summary.pdf" \
  --attachment "defects.xlsx"

执行成功输出:

Email sent successfully
Message-ID: <1894a3b2...@smtp.gmail.com>
Attachments: 2
Recipients: 2 (1 to + 1 cc)

案例2:HTML格式的产品发布通知

先将HTML正文写入文件release_notice.html:

<h2 style="color:#1a73e8;">v2.4.0 已发布</h2>
<p>本次发布包含以下改进:</p>
<ul><li>搜索响应速度提升 35%</li><li>新增批量导出能力</li></ul>

随后投递:

python email_sender.py \
  --to "all-staff@company.com" \
  --subject "[发布通知] v2.4.0" \
  --html-file "release_notice.html"

案例3:Python API集成到Airflow DAG

from email_sender import EmailSender
# ...
sender = EmailSender("email_config.json")
result = sender.send_email(
    to_email="data-ops@company.com",
    subject="ETL 任务失败告警",
    body="task_id=etl_user_dim, duration=1800s, error=connection_timeout",
    attachments=["/opt/airflow/logs/etl_user_dim.log"]
)
if not result["success"]:
    raise RuntimeError(f"告警邮件投递失败: {result['error']}")

异常应对

AUTH_001 应用专用密码缺失或失效

  • 现象:smtplib.SMTPAuthenticationError: 535 Username and Password not accepted.
  • 原因:Gmail账号未启用2FA,或应用专用密码过期/被撤销.
  • 处理:重新生成16位应用专用密码,确认账号2FA处于开启状态,更新email_config.json或环境变量后重投.

CONN_002 SMTP端口被防火墙拦截

  • 现象:smtplib.SMTPConnectError: Connection refusedsocket.timeout.
  • 原因:587端口被企业出口防火墙拦截,或服务商针对该IP限流.
  • 处理:切换至465(SSL)端口并设置use_ssl=trueuse_tls=false;若仍失败,改用服务商提供的API投递通道(如Gmail API).

ATTACH_003 附件超过25MB阈值

  • 现象:smtplib.SMTPDataError: 552 Message size exceeds fixed limit.
  • 原因:单邮件总附件体积超过服务商硬限制(Gmail/Outlook为25MB).
  • 处理:压缩附件或拆分为多封邮件;对超大文件改用云存储链接(OneDrive/Google Drive)放入正文,附件只保留摘要.

FORMAT_004 收件人邮箱格式非法

  • 现象:ValueError: Invalid recipient format: user@.
  • 原因:--to参数中存在缺失域名或非法字符的邮箱字符串.
  • 处理:调用前以正则^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$校验,剔除空项与重复项后.

ENCODING_005 主题包含非ASCII字符乱码

  • 现象:收件方主题显示为=?utf-8?b?...?=未解码或???.
  • 原因:未对Subject做RFC 2047编码,直接传入原始字节.
  • 处理:使用email.header.Header(subject, 'utf-8').encode()构造主题,确保多语言字符正确显示.

RATE_006 触发服务商发信速率限制

  • 现象:SMTPSenderRefused: 550 5.4.5 Daily user sending quota exceeded.
  • 原因:短时间投递量超过服务商配额(Gmail普通账号约500封/天).
  • 处理:引入令牌桶限速(建议50封/分钟),超出配额时切换备用发信账号或队列暂存次日重投.

SSL_007 TLS握手协商失败

  • 现象:ssl.SSLError: [SSL: WRONG_VERSION_NUMBER].
  • 原因:端口与加密模式错配,如465端口使用了STARTTLS而非隐式SSL.
  • 处理:核对smtp_portuse_tls/use_ssl组合(587配合TLS,465配合SSL),必要时升级Python至3.8以上以支持现代TLS 1.2.

CONFIG_008 凭据文件路径不可达

  • 现象:FileNotFoundError: email_config.json.
  • 原因:工作目录与配置文件不在同一路径,或容器未挂载凭据卷.
  • 处理:使用绝对路径EmailSender("/etc/secrets/email_config.json"),或改用环境变量注入,避免依赖相对路径.

疑问解答集

Q1: 是否支持接收与解析邮件(IMAP/POP3)?

不支持。本Skill专注于SMTP发信链路,接收侧请使用imap-tools或服务商API单独实现,避免与发信凭据混用.

Q2: 一封邮件最多能带多少附件?

受服务商总大小限制(Gmail/Outlook为25MB,QQ邮箱为50MB)。附件数量无硬上限,但建议单邮件不超过10个以保证客户端渲染体验.

Q3: 能否通过代理服务器发信?

可以。在email_config.json中新增proxy_hostproxy_port字段,SMTP连接将通过SOCKS5代理转发,适用于内网隔离环境.

Q4: HTML邮件为何在Outlook客户端样式错乱?

Outlook使用Word渲染引擎,不支持flexgridborder-radius等现代CSS。建议使用表格布局与内联样式,避免外部CSS引入.

Q5: 如何避免邮件被识别为垃圾邮件?

配置SPF、DKIM、DMARC三条DNS记录;使用固定发信域名;正文避免全图片、敏感词与超额链接;逐步预热发信IP而非突发大批量投递.

Q6: 多账号轮询发信如何实现?

email_config.json中以accounts数组提供多组凭据,SDK内部按权重轮询并在单账号触发RATE_006时自动切换至下一个账号.

能力边界

  • 仅支持SMTP发信协议,不覆盖IMAP/POP3收信与邮件全文检索.
  • 附件大小受服务商硬限制约束,无法规避;超大文件需改用云链接方案.
  • HTML正文中的JavaScript会被所有主流邮箱客户端剥离,无法执行动态逻辑.
  • 发信速率与日配额由服务商策略决定,本Skill仅做本地限速建议,无法突破服务商上限.
  • 凭据明文存储于配置文件存在风险,生产环境必须改用环境变量或密钥管理服务(如Vault).
  • 国际化邮件头编码依赖Python标准库,低版本Python(3.8以下)对复杂字符集支持有限.

创新特色

效率提升量化分析

操作步骤手动耗时自动化耗时时间节约准确率提升
邮件发送5分钟/封10秒/封4分50秒/封100%
邮件批量发送30分钟/100封1分钟/100封29分钟100%
邮件格式调整10分钟/封5秒/封9分55秒/封100%
邮件附件添加5分钟/封3秒/封4分57秒/封100%
邮件内容校验10分钟/封5秒/封9分55秒/封100%

差异化对比

对比维度本技能手动操作Python脚本专业软件
适配性支持多供应商,自动协商TLS/SSL逐个配置,手动协商需要编写代码,配置复杂需要购买,配置复杂
内容模式纯文本与HTML双模式单一模式,需手动转换可自定义,但需要编程能力功能丰富,但成本高
附件处理多附件并行投递逐个上传,效率低可并行处理,但需要编程能力功能丰富,但成本高
收件人编排支持CC/BCC手动添加,易出错可自定义,但需要编程能力功能丰富,但成本高
凭据管理支持凭据双通道手动输入,易泄露可自定义,但需要编程能力功能丰富,但成本高

核心痛点解决

痛点描述影响范围解决方案量化效果
邮件发送效率低邮件发送需要手动操作,耗时较长影响工作效率自动化邮件发送,提高效率时间节约90%
邮件格式不统一邮件格式调整需要手动操作,易出错影响邮件效果自动化格式调整,提高准确率准确率提升100%
邮件附件处理复杂邮件附件添加需要手动操作,效率低影响邮件完整性自动化附件处理,提高效率效率提升80%

安全规范

  1. 使用安全的API Key,避免泄露到版本控制系统。
  2. 设置合理的SMTP服务器认证信息,避免被非法访问。
  3. 对邮件内容进行加密,防止敏感信息泄露。
  4. 定期更新Skill,修复已知的安全漏洞。
  5. 限制Skill的使用权限,防止未授权访问。

安全风险防范

风险项等级防护措施验证方法
API密钥泄露通过环境变量配置,禁止硬编码定期检查代码和配置文件
命令执行风险仅执行白名单命令,避免拼接用户输入使用沙箱环境测试
网络通信安全使用HTTPS协议,验证SSL证书定期检查证书有效期
敏感数据暴露输出结果中不包含密钥、令牌等敏感信息日志脱敏审查
未授权访问限制访问权限,实施认证机制定期审计访问日志

Top skills in this category