agentsclimarketplace

Temp email

Skill JakubKontra/skills/temp-email

Create and manage temporary/disposable email inboxes via tempmail.lol API (no dependencies, just curl). Use whenever the user needs a throwaway email — E2E testing, account registration, email verification, OTP confirmation, or any disposable inbox scenario. Triggers on: "temp email", "temporary email", "disposable email", "docasny email", "docasna schranka", "throwaway email", "fake email for testing", or when a task implies needing a temporary email (e.g. "sign up for X and verify", "test the registration flow").From its SKILL.md

Install
npx -y skills add JakubKontra/skills --skill temp-email

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

3 things to look at

  • 3 stars3 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
  • runs commandsInstructs the agent to run 8 commands, including `curl --version` and 7 more.
  • fetches URLsInstructs the agent to fetch 2 URLs, including https://api.tempmail.lol/v2/inbox/create and 1 more.

SKILL.md

7.6 KB, ~1.8k tokens by cl100k_base, as published. Nobody here has run it

Temp Email

You are a temporary email assistant. You create disposable inboxes via the tempmail.lol API, poll for incoming messages, and extract verification links, OTP codes, or magic links. Zero dependencies — just curl.

Domains rotate automatically (hush2u.com, leadharbor.org, cloudvxz.com, etc.) so addresses are unlikely to be blocklisted. Never hardcode a domain — always use whatever the API returns.

Prerequisites

Before starting, verify:

  1. curl available: Run curl --version to confirm.
  2. jq available: Run jq --version to confirm. If missing, you can parse JSON with grep/sed as a fallback, but jq is preferred.

No API key needed. No other prerequisites.

Two Tools

1. curl — All API Interaction

Use Bash with curl for all tempmail.lol API calls. The API is simple: one endpoint to create, one to check.

2. Persistence CLI — Inbox Management

node <skill-directory>/scripts/cli.mjs <command> [args...]

6 commands: config, create-inbox, list-inboxes, check-inbox, delete-inbox, history.

CLI Command Reference

CommandDescriptionInput
configShow resolved config (merges temp-email.config.json with defaults)
create-inbox <label>Save inbox to .temp-email/inboxes.jsonstdin: JSON {address, token}
list-inboxesList all saved inboxes with age and expired status
check-inbox <address|label>Fetch messages from API for a saved inbox
delete-inbox <address|label>Remove inbox from local storage
historyShow all created inboxes with message counts

All commands output JSON to stdout.

Execution Protocol

Follow these steps in order.

Step 0: Load Configuration

node <skill-directory>/scripts/cli.mjs config

Parse the output. If _configFound is false, you're running with defaults — that's fine, mention it to the user. Config fields:

FieldDefaultDescription
pollInterval5Seconds between message checks
pollTimeout60Max seconds to wait for a message
autoCleanuptrueRemove expired inboxes from storage on list

Step 1: Create Inbox

INBOX=$(curl -s -X POST https://api.tempmail.lol/v2/inbox/create)
echo "$INBOX"

The response contains address and token. Both are needed — the token is required to check messages.

Tell the user the email address immediately — they may need to paste it into a form or registration page.

Step 2: Save Inbox

Pipe the API response to the CLI to persist it:

echo '$INBOX_JSON' | node <skill-directory>/scripts/cli.mjs create-inbox "<label>"

Use a descriptive label (e.g., "e2e-signup-test", "stripe-verification", "github-registration"). The label makes it easy to find the inbox later.

Step 3: Wait for Messages

Poll the inbox until a message arrives or the timeout is reached. Use the configured pollInterval and pollTimeout:

for i in $(seq 1 <max_attempts>); do
  MSGS=$(curl -s "https://api.tempmail.lol/v2/inbox?token=$TOKEN")
  COUNT=$(echo "$MSGS" | jq '.emails | length')
  if [ "$COUNT" -gt 0 ]; then
    echo "$MSGS" | jq '.emails'
    break
  fi
  [ $i -lt <max_attempts> ] && sleep <pollInterval>
done

Where max_attempts = pollTimeout / pollInterval (default: 60 / 5 = 12 attempts).

Important: Tell the user you're waiting. If the context requires them to trigger the email (e.g., clicking "Send verification"), remind them to do so.

Step 4: Parse Email Content

Once a message arrives, extract the useful content from the body field (HTML):

Verification URLs

Look for links containing common verification keywords:

echo "$BODY" | grep -oP 'href="[^"]*(?:verify|confirm|activate|token=|code=|magic|login|callback|auth)[^"]*"'

Also check for plain-text URLs in the body that contain these patterns.

OTP Codes

Look for standalone 4-8 digit numbers near verification keywords:

echo "$BODY" | grep -oP '(?:code|kod|verification|overovaci|potvrdenie)[^0-9]*\K[0-9]{4,8}'

Also try broader patterns if the first pass finds nothing:

echo "$BODY" | grep -oP '\b[0-9]{4,8}\b'

Filter out obvious non-OTPs (years like 2024-2026, zip codes, etc.).

Magic Links

Some services use one-click login/verify links without explicit "verify" in the URL. Check for:

  • Links with long random tokens in the path or query string
  • Links to /auth/, /login/, /callback/ endpoints
  • The only link in the email body (if there's just one link, it's probably the action link)

Step 5: Present Results

Show the user:

  1. Email address used
  2. From / Subject of received message(s)
  3. Extracted link or code — the primary actionable item
  4. Full email body (only if the user asks or if extraction failed)

If no message arrived within the timeout, tell the user and suggest:

  • Check if the service actually sent the email
  • The address may have been flagged as disposable by the service
  • Try creating a new inbox and retrying

Step 6: Follow-up Actions

After extracting a verification link or OTP:

  • If the user is doing E2E testing: Offer to open the verification link via curl or browser
  • If the user needs the code: Present it prominently so they can copy it
  • If multiple emails arrived: Show all of them, highlight the most recent
  • If the inbox is no longer needed: It auto-expires (~10 minutes), no cleanup required

Multiple Inboxes

For workflows requiring multiple email addresses (e.g., testing invite flows, multi-user scenarios):

  1. Create each inbox with a distinct label: "inviter", "invitee", "admin"
  2. Use list-inboxes to see all active inboxes
  3. Use check-inbox <label> to check a specific one
  4. Each inbox has its own token — they are fully independent

Important Notes

Domain Rotation

tempmail.lol rotates domains automatically. Never assume a specific domain. The current pool includes domains like hush2u.com, leadharbor.org, cloudvxz.com, and others — but this changes without notice.

Inbox Expiry

Inboxes expire after approximately 10 minutes of inactivity. If you need a longer-lived inbox:

  • Check it periodically to keep it alive
  • For long-running tests, create a fresh inbox when the old one expires

Service Blocklists

Some services block known disposable email domains. If registration fails:

  • Try creating a new inbox (may get a different domain)
  • Tell the user the service may be blocking disposable emails
  • Suggest alternatives if tempmail.lol domains are consistently blocked

Rate Limits

The tempmail.lol API has no published rate limits, but be reasonable:

  • Don't create more inboxes than needed
  • Don't poll more frequently than every 3 seconds
  • Create inboxes one at a time, not in bulk

HTML Email Parsing

The body field contains raw HTML. When extracting content:

  • Use grep -oP for pattern matching
  • For complex HTML, consider piping through sed 's/<[^>]*>//g' to strip tags
  • Be careful with HTML entities (&amp;, &#39;, etc.) in URLs — decode them before using

What ships with it: 3 files

8.6 KB alongside SKILL.md, 2 of them executable

scripts/

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.