back
loading skill details...
把 JD 发给 Agent,让他帮你投递简历
---
name: offer-rain
description: "当用户想要以邮箱方式投递简历时,使用这个 Skill 为用户发送邮件至招聘方邮箱。"
---
# 初始检查
如果[用户配置文件](user.json)存在且包含以下字段,则跳过**第一步步骤**:
- `smtp_server`: SMTP服务器地址
- `smtp_port`: SMTP服务器端口
- `sender`: 发件人邮箱地址
- `password`: 发件人邮箱密码
- `attachment_path`: 简历附件文件路径
# 单次投递步骤
## 第一步:配置用户信息
填入 [用户配置文件](user.json) 中的 `sender`, `password`, 和 `attachment_path` 字段。
1. 在本文件所在目录下创建一个名为 `user.json` 的文件。如果已经存在,请直接编辑该文件。
2. 直接填入以下字段:
```json
{
"smtp_server": "smtp.163.com",
"smtp_port": 465,
}
```
3. 询问用户关于以下字段的信息,并将其添加到 `user.json` 文件中:
1. `name`: 字符串类型,用户的姓名,配置邮件主题/正文时可使用。
- **询问语句**:请告诉我您的姓名。
1. `sender`: 字符串类型,用户的邮箱地址,并判断是否为有效的邮箱格式以及是否为 163 邮箱,如果否,则提示用户**仅支持 163 邮箱**,并中断后续流程。
- **询问语句**:请告诉我您的邮箱地址(仅支持 163 邮箱)
2. `password`: 字符串类型,用户的邮箱授权码。
- **询问语句**:请告诉我您的邮箱授权码,如果没有,请到 [网易邮箱官网-设置-POP3/SMTP/IMAP](https://mail.163.com) 获取,并确保已开启 SMTP 服务。
3. `attachment_path`: 字符串类型,简历附件文件的路径。
- **询问语句**:请告诉我您的简历附件文件路径。
- **验证**:检查文件是否存在,如果不存在,则提示用户重新输入,直到输入的路径有效为止。
- **注意**:写入 `user.json` 文件时,确保路径使用双反斜杠 `\\` 或单正斜杠 `/`,以避免路径解析错误。
**注意**: 请确保在配置用户信息时,`user.json` 文件的格式正确,且所有字段都已填写完整。
**用户配置文件示例**:
```json
{
"smtp_server": "smtp.163.com",
"smtp_port": 465,
"sender": "your_email@163.com",
"password": "your_email_password",
"attachment_path": "path/to/your/resume.pdf"
}
```
## 第二步:配置邮件信息
识别招聘启事/投递要求,配置邮件信息。
### 识别招聘启事/投递要求:
- 如果用户提供了较为详细的招聘启事/投递要求(如招聘方邮箱、邮件主题命名要求、邮件正文内容等),则根据这些要求配置相关的邮件信息,即如下字段:
- `receiver`: 招聘方邮箱地址
- `subject`: 邮件主题,根据投递要求进行编写
- `body`: 邮件正文内容,根据投递要求进行编写,默认为:“您好,我是XXX,现将我的简历发送给您,请查收,谢谢!”
- `attachment_name`: 邮件附件命名,根据投递要求进行编写
- 如果未识别到以上字段的信息,则询问用户关于邮件信息的详细要求,并根据用户的回答配置邮件信息:
- **询问语句**:
1. 请告诉我招聘方的邮箱地址。
2. 请告诉我邮件主题。
3. 请告诉我邮件正文内容,或者是否采取默认的“您好,我是XXX,现将我的简历发送给您,请查收,谢谢!”。
4. 请告诉我简历的命名规范。
### 根据招聘启事/投递要求,配置邮件信息
1. 创建一个 `XXX.json` 文件,其中 `XXX` 为招聘方的公司名称或职位名称,放在 `./log/YYYY-MM-DD/` 目录下,确保文件名唯一且具有描述性。
2. 识别招聘启事/投递要求后,参考 [邮件信息配置示例](example.json) 填写邮件信息,包括 `receiver`, `subject`, `attachment_name` 和 `body` 字段。
- `receiver`: 字符串类型,招聘方的邮箱地址。
- `subject`: 字符串类型,邮件主题。
- `body`: 字符串类型,邮件正文内容。
- `attachment_name`: 字符串类型,邮件附件命名
3. 继承 [用户配置文件](user.json) 中的 `smtp_server`, `smtp_port`, `sender`, `password` 和 `attachment_path` 字段。
**邮件信息配置示例**:
```json
{
"receiver": "recruiter@company.com",
"subject": "XXX-清华大学-大四",
"body": "您好,我是XXX,现将我的简历发送给您,请查收,谢谢!",
"smtp_server": "smtp.163.com",
"smtp_port": 465,
"sender": "your_email@163.com",
"password": "your_email_password",
"attachment_path": "path/to/your/resume.pdf",
"attachment_name": "XXX-清华大学-大四"
}
```
## 第三步:自检(强制)
逐字段核查邮件信息配置,**必须原样 quote 出 JD 中对应的原文**,禁止凭印象判断:
- **`receiver`**:
- **JD 原文**:<直接 quote JD 中关于投递邮箱的句子>
- **配置内容**:<当前 `receiver` 值>
- **是否命中**:[ ✅ / ❌ ] + 一句差异说明(邮箱域名是否一致、是否存在拼写/别名偏差)
- **`subject`**:
- **JD 原文**:<直接 quote JD 中关于邮件主题的要求>
- **配置内容**:<当前 `subject` 值>
- **是否命中**:[ ✅ / ❌ ] + 一句差异说明(模板是否对齐、命名占位符是否已被正确替换)
- **`body`**:
- **JD 原文**:<直接 quote JD 中关于邮件正文的要求>
- **配置内容**:<当前 `body` 值>
- **是否命中**:[ ✅ / ❌ ] + 一句差异说明(JD 列举的要素是否全部出现、是否漏掉"最早到岗日 / GitHub 链接"等硬性要求)
- **`attachment_name`**:
- **JD 原文**:<直接 quote JD 中关于简历命名的要求>
- **配置内容**:<当前 `attachment_name` 值>
- **是否命中**:[ ✅ / ❌ ] + 一句差异说明(命名格式是否一致、是否含 `\ / : * ? " < > |` 等 OS 非法字符)
**Fail-stop 规则**:自检任意一项为 ❌,必须回到第二步修正配置,**禁止进入第四步(发送前用户确认)**。
## 第四步:发送前请求用户确认
将邮件信息配置文件的以下内容展示给用户,并请求用户确认是否发送邮件。**必须得到用户的明确确认**,才能继续发送邮件。
- 招聘方邮箱地址(`receiver`)
- 邮件主题(`subject`)
- 邮件正文内容(`body`)
- 简历附件文件路径(`attachment_path`)
- 简历附件文件命名(`attachment_name`)
## 第五步:发送邮件
运行 `scripts/send_email.py` 脚本,使用配置好的邮件信息发送邮件。
```bash
python scripts/send_email.py --config ./log/YYYY-MM-DD/XXX.json
```
## 第六步:汇报
根据脚本的执行结果,向用户汇报邮件发送是否成功。
# 批量投递
当用户需要批量投递简历时,则按照单次投递的操作步骤,针对每个招聘方创建一个独立的邮件信息配置文件,编写好后,交给用户一起确认,用户确认后,依次调用 `scripts/send_email.py` 脚本发送邮件,并最终向用户汇报每封邮件的发送结果。
**重要**:需将每份投递对应的 `receiver`, `subject`, `body`, `attachment_path`, `attachment_name` 完整发给用户确认。
# 用户信息配置
## 配置修改
当用户需要修改已配置的用户信息时,直接编辑 [用户配置文件](user.json) 中的相关字段即可。
## 记忆化
每次投递时,如果第一次在投递要求中识别出了以下信息且用户已提供,则询问用户是否希望将这些信息记忆化,以便下次投递时直接使用:
- `School`: 用户所在学校名称
- `Major`: 用户所学专业名称。
- `Graduation Year`: 预计毕业年份。
- `Graduation Month`: 预计毕业月份。
- `Current Grade`: 当前所在年级(本科/硕士/博士/大一/硕一/博一)。
- **Others**
don't have the plugin yet? install it then click "run inline in claude" again.