Blog/Engineering
EngineeringOct 12, 20265 min read

How to require human approval before an AI agent sends email

Three working patterns for putting a human approval gate in front of AI-written email, with a SendGuard preflight example that only escalates the risky sends.

By SendGuard Team
human in the loopapprovalsai agentsai sdremail guardrails

Short answer

To require human approval before an AI agent sends email, remove the agent's direct send capability and route every outbound message through a gate that returns a decision. The agent may only send when the gate says allow or when a human resolves the request as approved. A rule in the system prompt is not a gate: the model can rationalize past it, and a prompt injection can talk it out of it. The gate has to live outside the model, in code the agent cannot call around.

There are three common ways to build that gate: approve everything (a drafts folder), pause the agent framework on the send tool (for example LangGraph human-in-the-loop), or run a policy preflight that allows low-risk mail and escalates only risky sends to a person. The rest of this post compares them and shows the preflight version with SendGuard.

Pattern 1: every email becomes a draft

The agent can create drafts but has no tool that sends. A person reviews each draft and sends it.

Pattern 2: interrupt the agent on the send tool

Frameworks such as LangGraph can pause execution when the agent calls send_email, persist state, and resume after a reviewer approves, edits, or rejects.

Pattern 3: policy preflight, escalate only the risky sends

Before each send, the agent calls a preflight API with the sender, recipient, message, and context. The API returns one of four decisions:

  1. allow: send now.
  2. delay: hold and retry later, for example while a new mailbox warms up.
  3. requires_approval: create an approval request and wait for a person.
  4. block: do not send.

Each decision comes with a risk score, reason codes such as SENSITIVE_INDUSTRY, PRICING_CLAIM_DETECTED, or MAILBOX_TOO_NEW, and recommendations. Humans only see the mail that tripped a policy, so review effort scales with risk instead of volume.

Preflight gate in code

This is the whole gate. The agent is given guarded_send as its only email tool; send_email is never exposed to the model.

import requests

SENDGUARD = "https://api.sendguard.ai"
HEADERS = {"Authorization": "Bearer sk_live_xxx"}

def guarded_send(draft, send_email):
    resp = requests.post(
        f"{SENDGUARD}/v1/preflight/email",
        headers=HEADERS,
        json={
            "workspace_id": "ws_demo",
            "agent_id": "sdr-agent-01",
            "policy": "balanced",
            "from": {"email": draft["from"]},
            "to": {"email": draft["to"], "industry": draft.get("industry")},
            "message": {"subject": draft["subject"], "body": draft["body"]},
            "context": {"intent": "cold_outbound", "relationship": "new_prospect"},
        },
        timeout=10,
    )
    resp.raise_for_status()
    result = resp.json()

    if result["decision"] == "allow":
        send_email(draft)
        return {"sent": True}

    # delay, requires_approval, and block never reach the mail provider here.
    return {"sent": False, "decision": result["decision"], "reasons": result["reasons"]}

A reviewer works through pending requests with GET /v1/approvals?status=pending and resolves each one with POST /v1/approvals/{id}/resolve and a body of {"status": "approved"} or {"status": "rejected"}. Only approved requests are handed back to the sender.

After sending, report what happened with POST /v1/feedback/outcome (delivered, bounced, complaint, replied, or unsubscribed). Outcomes feed sender health, so an agent whose mail starts bouncing gets more conservative decisions without a code change.

Which pattern to choose

The patterns stack. Many teams preflight everything and still route requires_approval into the same review UI they built for drafts.

What a preflight gate does not do

A preflight decision is advice to your sender, not a send. SendGuard does not deliver email, does not guarantee inbox placement, and cannot stop a send path you left open. If the agent can still reach your mail provider directly, the gate is optional, and optional gates fail.

Try it on your own flow

The SendGuard $1 pilot is a one-time $1 purchase for 100 production preflight checks. It is not a subscription. Run a redacted or synthetic version of one real AI email through it and check whether the decision and reasons would have changed what your agent did. Full request and response fields are in the API docs.

FAQ

Is a system-prompt rule like "always ask before sending" enough? No. The model can ignore or rationalize past instructions, and prompt injection can override them. Approval has to be enforced by code that holds the send capability.

Does every email need a human? Not with a preflight gate. Low-risk mail returns allow and sends immediately; only mail that trips a policy returns requires_approval.

What should happen when an approval times out? Treat a timeout as rejected. Never let an unanswered approval default to sending.

How is this different from email verification tools like ZeroBounce or NeverBounce? Verification answers whether an address is likely deliverable. A preflight gate also asks whether this agent should send this message to this recipient now under your policy. See the comparisons.

Build with SendGuard

Put outbound policy in front of every AI-generated email.

Use one API to score risk, enforce approval, and protect sender reputation before delivery.

More from the blog

Related reading on safer AI outbound systems.

ProductMay 6, 20262 min read

Why AI outbound needs a preflight firewall

Traditional deliverability checks are not enough once AI agents can autonomously send cold email at machine speed.

AI outboundsender reputationemail safety
Read article →
EngineeringMay 3, 20262 min read

Agent-aware policy is the next control plane for outbound email

The same message should not be treated equally when it comes from a new autonomous agent versus a trusted production workflow.

agent policytrust systemsoutbound controls
Read article →