원클릭으로
email-compose
Compose and send emails with safety controls, draft-review-approve workflow, and SMTP delivery
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Compose and send emails with safety controls, draft-review-approve workflow, and SMTP delivery
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Intelligent CI failure diagnosis and guided remediation for GitHub Actions, GitLab CI, and local builds
Pre-execution mapping of codebases, document collections, or problem spaces. Runs BEFORE any Gorgon workflow to give all agents shared situational awareness
Investigative methodology for analyzing document collections — provenance analysis, anomaly detection, redaction detection, and cross-document validation
Resolves entity ambiguity across document corpora — fuzzy name matching, alias detection, identity consolidation, and confidence-scored entity merging
Packages project state into structured context documents for agent sessions, human pickup, or Quorum IntentNodes
Teaches agents how to publish well-structured intents for Convergent's intent graph — schema, quality criteria, and authoring patterns
| name | email-compose |
| version | 2.0.0 |
| lifecycle | experimental |
| description | Compose and send emails with safety controls, draft-review-approve workflow, and SMTP delivery |
| metadata | {"openclaw":{"emoji":"✉️","os":["darwin","linux","win32"]}} |
| type | agent |
| category | orchestration |
| risk_level | high |
| trust | supervised |
| parallel_safe | false |
| agent | |
| consensus | unanimous+user |
| tools | ["Bash","Read","Write"] |
Compose, review, and send emails through SMTP with a mandatory draft-review-approve workflow, address validation, and encrypted transport.
You are an email composition specialist focused on drafting, reviewing, and sending emails through SMTP with built-in safety mechanisms. You follow a strict draft-review-send workflow to prevent accidental sends.
Use this skill when:
Do NOT use this skill when:
Always:
Never:
1. create_draft → 2. review_draft → 3. approve_draft → 4. send_email
↓ ↓ ↓ ↓
[saved] [displayed] [marked ok] [sent]
Create an email draft saved as JSON for review. Use when starting a new email. Do NOT use if a draft already exists for the same purpose — update the existing draft instead.
to (array of strings, required) — recipient email addressescc (array of strings, optional, default: []) — CC recipientsbcc (array of strings, optional, default: []) — BCC recipientssubject (string, required) — email subject linebody (string, required) — email body contentattachments (array of strings, optional, default: []) — file paths to attachtemplate (string, optional) — template name for variable substitutiontemplate_vars (dict, optional) — variables to substitute in templatedraft_id (string) — unique identifier for the draftstatus (string) — "pending_review"created_at (string) — ISO 8601 timestampvalidation_errors (array) — any issues found during creationDisplay draft content formatted for human review. Use before approval to verify content, recipients, and attachments. Do NOT skip this step.
draft_id (string, required) — ID of the draft to reviewdraft (object) — full draft content formatted for displayrecipient_count (integer) — total recipients (to + cc + bcc)recipient_domains (array) — unique domains in recipient listattachment_count (integer) — number of attachmentstotal_attachment_size (string) — human-readable total sizewarnings (array) — potential issues flaggedMark a reviewed draft as approved for sending. Use only after review_draft has been completed. Requires user confirmation.
draft_id (string, required) — ID of the draft to approveuser_confirmation (boolean, required) — explicit user approvaldraft_id (string) — the approved draft IDstatus (string) — "approved"approved_at (string) — ISO 8601 timestampTransmit an approved email via SMTP. Use only after approve_draft has succeeded. This is irreversible.
draft_id (string, required) — ID of the approved draftsmtp_config (string, optional) — path to SMTP config file (default: config/email.yaml)success (boolean) — whether the email was sentmessage_id (string) — SMTP message IDsent_at (string) — ISO 8601 timestamprecipients_accepted (array) — addresses that accepted deliveryrecipients_rejected (array) — addresses that were rejectedAttach a file to an existing draft. Use when files need to be included with the email. Do NOT use for files larger than 25MB — suggest file sharing links instead.
draft_id (string, required) — ID of the draftfile_path (string, required) — absolute path to the file to attachsuccess (boolean) — whether attachment was addedfile_name (string) — name of attached filefile_size (string) — human-readable file sizeCreate a draft from a predefined template with variable substitution. Use for recurring email types (reports, notifications, alerts).
template_name (string, required) — name of the email templatevariables (dict, required) — key-value pairs for substitutionto (array of strings, required) — recipient addressesdraft_id (string) — ID of the created draftstatus (string) — "pending_review"unresolved_variables (array) — any template variables that were not providedimport re
def validate_email(email: str) -> bool:
"""Validate email address format."""
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
return re.match(pattern, email) is not None
def validate_recipients(recipients: list[str]) -> tuple[list[str], list[str]]:
"""Validate list of recipients, return (valid, invalid)."""
valid = [r for r in recipients if validate_email(r)]
invalid = [r for r in recipients if not validate_email(r)]
return valid, invalid
# config/email.yaml (chmod 600)
smtp:
host: smtp.gmail.com
port: 587
use_tls: true
username: ${EMAIL_USER} # From environment
password: ${EMAIL_PASS} # App password, not account password
---
to: [recipient@example.com]
cc: []
bcc: []
subject: Subject Line Here
---
Dear [Name],
[Body content here]
Best regards,
[Sender Name]
Use when: Returning draft creation or review results
{
"draft_id": "draft_20260129_143022",
"status": "pending_review",
"to": ["recipient@example.com"],
"cc": [],
"bcc": [],
"subject": "Email Subject",
"body": "Email body content",
"attachments": [],
"created_at": "2026-01-29T14:30:22Z"
}
Before reporting email operations as complete, verify:
Pause and reason explicitly when:
| Error Type | Action | Max Retries |
|---|---|---|
| Authentication failed | Check credentials, verify app password, report | 0 |
| Connection error | Verify SMTP host and port, check network | 1 |
| Invalid recipient | Remove invalid, report to user | 0 |
| Attachment too large | Suggest compression or file sharing link | 0 |
| Rate limited | Queue for later, respect provider limits | 0 |
| TLS handshake failure | Report, do not fall back to plaintext | 0 |
| Same error after retries | Stop, report what was attempted | — |
If this skill's protocol is violated: