Communitygithub.com

请柬生成

做一封能进收件箱的 HTML 请柬:头图、一键回复、日历文件,并先给主人发测试信,再考虑客人。

请柬生成 是什么?

把一场活动做成真正发出去的请柬。它问清时间地点和结束时间,配头图、防垃圾邮件的 HTML、回复按钮、ics 日历和回复登记表,并先出测试稿给主人确认。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/flyncl/invite-builder-skill/tree/HEAD

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

Invite-Builder 技能

功能概述

此技能专为 Claude 设计,并在此环境中表现良好。它能制作一份自设计的 HTML 电子邮件邀请函,确保送达受邀人收件箱(而非被归入垃圾邮件),并包含一键式 RSVP 按钮、添加到日历的链接以及页眉视觉元素。最后会向用户发送一封测试邮件。未经明确批准,绝不会向任何人发送邮件。RSVP 状态会记录在电子表格中。

步骤 1 - 活动详情(先询问)

逐个提问,按此顺序:每条消息(或每次 AskUserQuestion 调用)提一个问题,并在收到回答后再问下一个。跳过用户已回答的问题。收集以下信息:

  • 活动名称及用户想要的确切措辞(如果用户已有,则逐字使用)
  • 日期和时区
  • 开始时间 和 结束时间。始终将两者作为单独的问题询问。切勿假设或编造结束时间:添加到日历的链接和 .ics 文件都需要它。如果主办方没有固定的结束时间(如“直到深夜”),请询问在日历条目中应设置什么结束时间,以及是否在邀请函上显示结束时间,或仅将其保留在日历中。
  • 完整地址(街道、城镇、州、邮编 - 地图应用需要邮编)
  • 主办方姓名和签名(例如“XOXO Clare and Conrad”)
  • 任何需要突出的特色(乐队、演讲者、着装要求)
  • RSVP 截止日期,以及是否需要“可能 - 提醒我”选项
  • 发送邮件的邮箱账户(为提高送达率,真实的个人收件箱最佳)
  • 是否需要纯文本版本,供只有电话号码或回复短信比电子邮件更快的客人使用(参见步骤 3b)

检查日期和星期是否匹配(例如确认 2026 年 12 月 19 日是星期六),并告知用户。

步骤 1b - 宾客名单

询问:“您是否有宾客名单需要上传,或者希望我为您创建一个电子表格?”

A. 用户有名单(Google Sheet 链接、CSV 或 Excel 上传、过去的 Paperless Post / Evite 导出,或粘贴的列表):

  • 读取名单,并在原始数据旁创建一个干净的跟踪标签页(切勿编辑用户的原始标签页):ID(G001...)、宾客姓名、邮箱、电话、已邀请(人数)、状态、参加情况、宾客备注、先前回复(如果来源有)、标记、邀请已发送、提醒已发送、最后更新。
  • 合并重复项(同一家庭有两个地址、分别回复的伴侣、“额外宾客”行),并在“标记”中注明每次合并。
  • 将状态设置为“未发送”,或对仅提供电话的宾客和之前退信的地址设置为“需要邮箱”。标记工作邮箱,以便筛选邀请。
  • 添加摘要标签页:总人数(对状态为“是”的宾客使用 SUMPRODUCT 计算参加人数)、是/可能/否/已邀请/未发送/需要邮箱/退信的人数、家庭总数、最大可能宾客数。添加状态下拉菜单。
  • 报告数量、合并情况以及缺少邮箱地址的宾客列表。

B. 用户想要一个新名单:

  • 创建一个名为“[活动名称] [年份] 宾客名单”的 xls 文件,包含相同的跟踪和摘要标签页(内容为空),并分享链接。
  • 告知用户他们可以粘贴姓名和邮箱地址,或在聊天中提供给您,由您添加。

C. 尚未准备好: 继续设计,并在步骤 5 之前回到名单处理。切勿在无名单的情况下发送邀请。

步骤 2 - 页眉视觉元素

询问:“您是否有想要使用的页眉图片?”

A. 用户上传一张图片。

  • 查看图片。从中选取 2-3 种颜色(主色调、用于文本的深色、用于背景的浅色)以及与其氛围匹配的字体组合(活泼图片 -> 圆角衬线;摄影或时尚风格 -> 干净无衬线;复古 -> 雕刻衬线)。
  • 如果图片有透明背景,则将其平铺到邀请函的背景色上(白色布局用白色)。透明 PNG 在白色页面上比带框图片更清爽。
  • 构建一个与之一致的设计,仅当用户要求时提供两个变体。

B. 用户没有图片。

  • 询问用户想要什么氛围(例如温馨、华丽、复古、简约、节日、优雅、俏皮)以及要使用或避免的颜色。
  • 自行创建页眉图片:
    • 如果已连接图像生成工具(例如 Canva generate-image),优先使用。要求制作宽横幅(2:1),主题在纯色或透明背景上,除非用户要求,否则不添加文字。
    • 否则,使用 SVG 绘制原创插图,并通过 Playwright 渲染为 PNG。
    • 切勿复制已知的角色、标识、艺术作品或品牌。
  • 提供 3 个不同的选项,每个都有各自的页眉、字体组合和调色板(例如俏皮、现代、经典)。在手机宽度下并排展示所有三个选项,让用户选择或组合。

步骤 3 - 构建电子邮件(经验教训)

电子邮件客户端不是浏览器。请遵循以下所有规则:

  • 布局:嵌套的 <table role="presentation">,最大宽度 520-560px,所有样式内联。不使用 CSS 类、flexbox 或外部图片。
  • 字体:仅使用网络安全字体栈:'Helvetica Neue',Helvetica,Arial,sans-serif, Palatino,'Palatino Linotype','Book Antiqua',serif, 'Times New Roman',Times,serif, Georgia,serif。通过字重、字间距、大写和字号来体现个性,而非自定义字体。
  • 请勿将文本放在彩色背景块上。某些客户端会剥离表格背景,导致白底白字。请在页面背景上使用彩色文本。对于纯色按钮,将颜色同时设置为包裹链接的 <td> 的 bgcolor="#hex" 以及链接本身的 background 属性。
  • 页眉图片:作为内联附件,引用为 src="cid:att0"(第一个附件)。调整大小至约 400-520px 宽,JPEG 质量约 45-60,目标文件小于 30KB,以便 base64 编码适合工具调用。设置明确的宽度/高度属性。
  • 左对齐或居中对齐保持一致 - 每个部分(详细信息、特色、RSVP、签名)都位于同一边缘。
  • 任何文案中不要使用长破折号,改用连字符。
  • 使用通用符号(例如 ❄ 雪花、◆ 菱形、📅 日历)。避免将文字星号用作装饰。

RSVP 按钮(mailto,无表单或登录)

三个按钮,每个都是一个 mailto 链接,指向主办方邮箱,并带有预填的主题和正文:

  • 是: 主题 RSVP YES: <活动>;正文询问“请告知共有几位来宾(请填写):”,并留出空白 - 切勿假设人数。
  • 可能 - 提醒我: 主题 RSVP MAYBE: <活动>;正文“希望参加 - 请接近日期时提醒我。”
  • 否: 主题 RSVP NO: <活动>。对主题和正文进行 URL 编码(urllib.parse.quote)。仅在用户要求时在按钮下方注明:宾客也可以直接回复。

添加到日历

一个带有日历图标的链接,指向 Google 日历的模板 URL:https://calendar.google.com/calendar/render?action=TEMPLATE&text=<标题>&dates=YYYYMMDDTHHMMSS/YYYYMMDDTHHMMSS&ctz=<IANA 时区>&location=<完整地址>&details=<一行>

同时附加一个 .ics 文件(METHOD:PUBLISH、VTIMEZONE 块、带 TZID 的 DTSTART/DTEND、LOCATION 带转义逗号、CRLF 换行符),供 Apple 日历和 Outlook 用户使用。

向用户解释:链接无法推送日历邀请;真正的日历邀请会向所有人暴露宾客名单。

步骤 3b - 短信版本(仅当用户在步骤 1 中回答“是”)

撰写一段简短纯文本版本,供主办方通过自己的手机发送:

  • 尽可能控制在 320 字符以内,以免被分割成多条消息。仅纯文本:无 HTML、无图片、无附件。
  • 使用主办方的语气,措辞与电子邮件一致:活动名称、星期和日期、开始时间、完整地址、特色(乐队、着装要求)、签名。
  • RSVP 行:“回复 是(以及参加人数)、可能 或 否”。不要使用 mailto 链接,因为在手机上操作不便。
  • 可选的添加到日历行:步骤 3 中的 Google 日历链接,仅当用户要求时(链接较长,可能使文本看起来像垃圾邮件)。
  • 不使用长破折号。仅当用户要求时使用表情符号。在消息撰写卡片中展示,以便用户可以复制或通过“信息”应用打开。也为“可能”和未回复的宾客提供一行提醒文本。
  • 明确告知用户:Claude 无法发送短信或阅读短信回复。用户自行发送短信,并在回复到来时更新跟踪器,或告知 Claude 并由 Claude 更新。在跟踪器中,将已通过短信通知的宾客的状态标记为“已邀请(短信)”以及在“邀请已发送”列中记录日期,以便电子邮件运行不会重复发送。

步骤 4 - 预览,然后测试发送

  • 渲染 HTML,将页眉替换为本地文件,并使用 Playwright 在 400px 宽度(device_scale_factor 2)和 640px 宽度下截图。在展示给用户之前,自己先检查。将预览保存为 [YY MM DD] [活动] Invite Preview.png 并提供。
  • 根据用户反馈迭代措辞、布局和颜色;每次重新预览。
  • 当用户要求测试时:仅向用户发送电子邮件,主题以 [TEST] 开头(然后 [TEST 2] 等),包含内联图片和 .ics 附件,以及纯文本替代正文。要求用户检查:图片内联显示、按钮打开预填回复、纯色按钮可见、日历链接和文件均有效、在手机上显示正确。
  • 将最终模板、.ics 文件和活动信息保存到 Claude 项目(如果已附加),以便后续会话可以发送。

步骤 5 - 向宾客发送(仅在用户表示准备就绪时)

  • 使用步骤 1b 中的跟踪器。每行有邮箱且状态为“未发送”的将进入发送队列;标记为“需要邮箱”的行将列出供用户处理。
  • 默认:一封发给用户且所有宾客在 BCC 中的 Gmail 草稿(内联图片必须每封邮件都附件,因此按宾客个性化发送不实用)。用户自行批准或发送。
  • 标记仅提供电话号码的宾客、退信地址、重复项以及可能过滤邀请的工作邮箱。
  • 发送后,将这些行的状态标记为“已邀请”,并记录发送日期。

步骤 6 - 持续跟踪(设置为定时任务)

提供针对同一跟踪器的持续跟踪:一个定时任务,可以拾取新添加的宾客、读取主题与 RSVP 匹配的回复、更新表格、为“可能”和未回复的宾客在提醒日期草拟(绝不发送)提醒邮件,并仅在有变化时向主办方发送更新邮件。

在创建任务之前,逐个询问以下问题(每条消息或每次 AskUserQuestion 调用提一个问题,等待每个回答):

  1. 您是否希望我监控您的收件箱以获取 RSVP?是:Claude 读取 RSVP 回复(按钮回复和自由文本回复),将每个回答、人数和备注记录在跟踪器中,并在有变化时向您发送更新邮件。否:Claude 不读取收件箱,由主办方自行更新跟踪器(或在聊天中告知 Claude)。
  2. 如果是:我应该多久检查一次收件箱以获取 RSVP?选项:每小时(在最后几周最佳)、每几小时、每天一次(更新邮件最少)、或其他。每小时通常是定时任务允许的最短间隔。如果他们希望在临近日期时改变频率(例如现在每天一次,最后一周每小时一次),则设置第一个计划,并提供一次性提醒以更改它。
  3. 当新宾客添加到跟踪器时,是否自动向其发送邀请?Claude 将主邀请转发给每个新行(主办方只需输入姓名和邮箱),或 Claude 创建草稿供主办方发送,或两者都不做。自动发送需要定时运行中具有 Gmail 发送/转发工具。如果组织设置移除了此功能,请提前说明并回退到草稿。
  4. 如果是问题 3:我应该多久检查一次跟踪器以查找新宾客?提供与问题 2 相同的选项,并建议与 RSVP 检查相同的计划,以便一个任务完成两项工作。仅当主办方要求不同频率时才使用单独的计划。
  5. 如果用户在步骤 1 中未回答短信问题,现在询问:您是否还需要短信版本?如果是,则执行步骤 3b。

如果问题 1 和问题 3 的回答均为“否”,则不创建定时任务。告知用户跟踪已关闭,他们可以在以后请求。

否则,将操作说明写入 Claude 项目(每个活动一个 .md 文件),仅涵盖主机打开的功能,并按照选择的计划创建定时任务。同时告知主机任务获得了哪些批准设置。

相关技能