Automatically read BOSS Zhipin forwarded resume emails from the corporate mailbox, download PDF attachments, extract text, screen candidates against job requirements, and output a concise recruitment recommendation report.
Dependencies
- imap-smtp-email skill: used to connect to the mailbox, search emails, and download attachments
- Skill path:
/agent/.agents/skills/imap-smtp-email/ - Configuration file:
/agent/.agents/skills/imap-smtp-email/.env - IMAP command:
node scripts/imap.js <command>
- Skill path:
- pdftotext: used to extract text from PDFs (pre-installed on the system)
- Job requirements document:
/agent/hiring/job_requirements.md
Workflow
Step 1: Retrieve new resume emails
Search the mailbox for BOSS Zhipin resume emails.
⚠️ Important: Starting 2026-04-08, BOSS Zhipin has switched to directly pushing a single resume per email to INBOX
- New format: one email per candidate, subject format "Candidate Name | X years, applying for Job Title | Shenzhen XX-XXK【BOSS Zhipin】", 1 PDF attachment
- Old format (deprecated): HR batch-forwarded to Sent Messages, one email containing multiple PDFs
cd /agent/.agents/skills/imap-smtp-email
# 优先检查 INBOX(新简历直推到这里)
node scripts/imap.js check --limit 20 --mailbox INBOX
# 也检查 Sent Messages 和专用文件夹(旧格式兼容)
node scripts/imap.js check --limit 10 --mailbox "Sent Messages"
node scripts/imap.js check --limit 10 --mailbox "其他文件夹/BOSS直聘简历"
Screening method: the subject contains "BOSS Zhipin" or "applying for", and the attachments array is non-empty (contains .pdf attachments).
Important: record the UIDs of already-processed emails to /agent/hiring/processed_uids.jsonto avoid duplicate analysis.
Step 2: Download resume PDFs
node scripts/imap.js download <uid> --mailbox "<mailbox>" --dir /agent/hiring/resumes/
Step 3: Extract resume text
pdftotext "/agent/hiring/resumes/<filename>.pdf" - 2>/dev/null
Note: BOSS Zhipin PDF resumes usually contain a large amount of watermark noise (random string lines of 1-4 characters). After extraction, filter:
- Remove lines containing only 1-4 alphanumeric characters
- Remove long hash-like string lines that appear to be watermarks
- Keep lines with actual content
Step 4: Read job requirements
Read /agent/hiring/job_requirements.md to obtain the following for currently open positions:
- Must-have skills list
- Nice-to-haves
- Scoring weights
- Red flag/yellow flag/green flag criteria
Step 5: Analyze each resume and generate a report
Evaluate each resume, focusing on the following dimensions:
- Education: school tier, relevance of major
- Work experience: years, industry match, tech stack match
- Core skills: overlap with the position's must-have skills
- Project highlights: whether there are hands-on projects related to core directions such as AI Agent/MCP/OT
- Risk factors: job-hopping frequency, industry span, whether expected salary exceeds the range
Step 6: Output the report
The report format is divided into two parts, and should be concise and forceful, not written like a thesis:
Part 1: Recommended candidates (the most suitable candidates)
For each candidate recommended for interview, output:
## ⭐ [候选人姓名] — 投递岗位:xxx
**为什么推荐:**
- 闪光点1(一句话说清楚)
- 闪光点2
- 闪光点3
**面试关注点:**
需要验证的地方,用1-2句话说明
**建议提问(3题):**
1. [具体的深度面试问题,不要泛泛而谈]
2. [紧扣候选人简历中的项目/经历来提问]
3. [考察与岗位核心要求的匹配度]
Part 2: Quick overview of other candidates
## 📋 其他候选人(共X人)
| 姓名 | 投递岗位 | 结论 | 一句话原因 |
|------|---------|------|-----------|
| xxx | xxx | ❌不匹配 | 无AI经验,纯传统前端 |
| xxx | xxx | 🔶待定 | 有潜力但经验不足,可留意 |
Keep it concise. For unsuitable people, just state the reason clearly in one sentence; do not elaborate.
File path conventions
| File | Path |
|---|---|
| Job requirements | /agent/hiring/job_requirements.md |
| Resume PDF | /agent/hiring/resumes/ |
| Processed UIDs | /agent/hiring/processed_uids.json |
| Analysis report | /agent/hiring/reports/YYYY-MM-DD.md |
Step 7: Push to the WeCom group
After the analysis report is completed, push it to the specified group chat via the WeCom group bot Webhook.
Configuration
- Webhook configuration file:
/agent/hiring/.wecom_webhook - Push script:
/agent/hiring/wecom_bot.sh
Push content
- Markdown summary: recommended/pending/not matched counts + Top candidate highlights (WeCom markdown limited to 4096 bytes)
- Full report file: upload the day's analysis report MD file
- Original resumes of recommended candidates: upload the PDF resumes of candidates recommended for interview
API description
# 发送Markdown消息
curl "$WEBHOOK_URL" -H 'Content-Type: application/json' -d '{"msgtype":"markdown","markdown":{"content":"..."}}'
# 上传文件获取media_id
curl -X POST "$UPLOAD_URL" -F "media=@file.pdf;filename=file.pdf"
# 发送文件消息
curl "$WEBHOOK_URL" -H 'Content-Type: application/json' -d '{"msgtype":"file","file":{"media_id":"..."}}'
Limits
- Message frequency: 20 messages/minute (at least 2 seconds between each send)
- markdown content max 4096 bytes
- File size 5B~20MB
- media_id valid for 3 days
- WeCom webhook markdown does not support tables (non-v2), use quotes/lists instead
Execution
bash /agent/hiring/wecom_bot.sh /agent/hiring/reports/YYYY-MM-DD.md /agent/hiring/resumes/
Notes
- BOSS Zhipin resume PDFs have watermarks; noise must be filtered when extracting text
- IMAP Chinese SUBJECT search is unreliable; prioritize filtering by attachment count and sender
- Some resumes are image-only PDFs (e.g., Wang Xu's resume); pdftotext cannot extract them, so they must be marked as "unparseable"
- One email may contain multiple resumes (e.g., 25 packed into one email)
- Remember to update
processed_uids.jsonto avoid duplicate processing - After the report is generated, automatically push it to the WeCom group (Step 7), and send the resume attachments of recommended candidates together