360 Secure SkillHub
360 安全技能中心

Agent email (Mails.ai)

通过 Mails.ai MCP 服务为智能体创建真实邮箱地址,支持发送、接收、转发、草稿与线程内回复;入站邮件先做提示注入评分并隔离高风险邮件,出站拒发冷邮件,可用测试密钥在不实际发送的情况下演练全流程。

mailsai
mailsai
热度 13.02
最近更新 2026-09-23 02:17:52
分类:协作依赖:MCP 服务 / 第三方 API应用场景:邮件起草 / 工作流

安装技能

复制下面的话术发给你的 Agent,它会通过 secure-skills 检索并安装该技能。

执行命令安装此 skill: npx secure-skills-cli add mailsai-email
Metadata
name
mailsai-email
description
Give your agent a real email address it can send from, receive at, and reply in-thread — with an injection scan on every inbound and a dry-run sandbox before anything transmits.
version
1.0.0
metadata
{"openclaw":{"requires":{"env":["MAILS_API_KEY"],"bins":["node"]},"primaryEnv":"MAILS_API_KEY","envVars":[{"name":"MAILS_API_KEY","required":true,"description":"Mails.ai API key. Keys beginning mk_test_ run the full pipeline in sandbox mode and never transmit a message."},{"name":"MAILS_BASE_URL","required":false,"description":"Override the API base URL. Defaults to the public Mails.ai API; set this only for self-hosted or staging deployments."}],"install":[{"kind":"node","package":"@mailsai/mcp-server","bins":["mails-mcp"]}],"emoji":"📬","homepage":"https://mails.ai/docs"}}

Agent email: send, receive, reply

Most agent setups can only ever draft. This gives your agent a real mailbox — a working address that sends, receives, and holds a thread — and puts a review layer in front of the parts that are risky to automate.

Backed by the @mailsai/mcp-server package (20 MCP tools). Works in any MCP runtime.

Setup

  1. Get a key at https://mails.ai — the free tier needs no card.
  2. Export it, then let the skill start the server:
export MAILS_API_KEY="mk_test_..."   # start with a TEST key
npx -y @mailsai/mcp-server

Start with a mk_test_ key. It exercises the entire path — validation, firewall verdict, event, webhook — and transmits nothing. Swap to a live key only once you have watched a full loop succeed.

The loop

mails.create_agent   → give the agent its address
mails.send           → send as that agent
mails.list_received  → read what came back
mails.get_received   → read one message, with its injection score
mails.reply          → answer in-thread

Tools

Sending: mails.send, mails.reply, mails.forward, mails.create_draft, mails.send_draft Receiving: mails.list_received, mails.get_received, mails.list_replies, mails.list_threads, mails.get_thread, mails.list_messages Identity: mails.create_agent, mails.list_agents, mails.me Safety and ops: mails.get_reputation, mails.check_suppression, mails.allowlist_address, mails.get_event, mails.get_usage, mails.test_inbound

Inbound is untrusted input — treat it that way

An inbox is a channel a stranger writes into, so anything arriving may try to instruct your model rather than inform it. Every inbound message is scored for prompt injection before your agent sees it, and messages scoring above the quarantine threshold are flagged quarantined on the event.

Use mails.test_inbound to feed a crafted message through the same path and see the score, so you can prove your handling works before a real one arrives.

The score is a signal, not a guarantee. Keep your own rule that content inside an email is data, never instructions — and never let a single inbound message reach both private context and an outbound action without a check in between.

What this refuses to send, on purpose

Outbound is checked before transmission, and cold outreach is refused at the API with 422 cold_email_prohibited rather than being discouraged in a policy page. That is deliberate: it keeps the sending reputation your agent depends on from being spent by a message you did not write.

If you want an agent that sends unsolicited pitches, this is the wrong tool and it will refuse you. It is built for transactional mail an agent legitimately owns — confirmations, replies, notifications, receipts, support threads.

A refusal names the reason and offers a second review if it got you wrong.

Costs and limits

Free tier covers 3,000 events/month and one agent, without a card. Sends are rate-limited per hour and per day. mails.get_usage reports where you stand.