01 / THE SIGNAL

我们发现了什么

我让 AI agents 处理了 50 封邮件。ai、#api、#security、#sideprojects 这次 50 封邮件的实验于 8 月 12 日……

  • 来源:DEV Community(发现于 2026-08-16)
  • 证据等级:D · 发现产品或需求信号,暂未获得可核验的商业证据。
  • 商业模式:API / Usage-based
  • 主题:AI Agent
  • 初筛评分:18.9/100 · 收录 1 次
#工作流自动化#待验证#产品发现
02 / SOURCE & EVIDENCE

证据,比故事更重要。

发现产品或需求信号,暂未获得可核验的商业证据。

规则清洗与初筛,未经人工商业核验。原文语境、实际客户和付费情况仍需自行验证。

引用与数字披露

来源类型(原作者自述/第三方测算/媒体转引)需采集端标注,本版尚未落字段。

短句引用
作者
未标注
抓取日期
来源类型
未标注
数字口径
币种
未标注
口径
未标注
披露主体
未标注
披露日期
未标注

上下文核对:来源原文含限定词一次性,中文摘要未逐字保留 —— 引用或跨期比较前请回原文核对,别把估算读成已实现。

中文辅助译文(全文)

ai, #api, #security, #sideprojects 五十封邮件的实验

8月12日,我交给一个 AI 智能体一份包含五十个邮箱地址的 CSV 文件和一个 SMTP 工具。三十八分钟后,其中十二个退信了。

我并不是想破坏什么。我在测试一个本地智能体能否端到端地处理一项简单的外联任务:读取列表,起草一段简短的内容,发送出去。我使用的模型是 Muse Glimmer——Meta 于 2026 年 8 月 10 日发布的 300 亿参数开源权重智能体模型。它足够小,可以在单块消费级 GPU 上运行,这意味着这类智能体即将无处不在——在你的笔记本上、在 Docker Sandbox 容器内,或者接入像 qm 这样的多智能体协作框架。更多的工具、更多的自主权,也意味着更多发送失误的机会。

智能体把 send_email 仅仅视为又一个函数调用。它没有询问这些地址是否真实、可达或可信。它向 SMTP 发起探测,收到一批 250 OK 的应答,便直接发送。其中一个地址是 test@gmail.com。SMTP 表示通过。我事后构建的守门员则拒绝了。

这是我希望当初能先放在邮件发送器前面的守门员:

当我针对 test@gmail.com 运行它时,SMTP 返回的结果是已验证。综合信任分数返回的是 false。智能体原本会发送。守门员没有。 守门员实际看到的内容

我得到的响应值得完整读一遍:

对一次 HTTP 调用来说,这里面包含的信号量非常大。首先跳出来的是矛盾:smtpverified 为 true,但 istrusted_identity 为 false。如果你的智能体只检查 SMTP,就会把这个地址视为可送达并继续。守门员则将其视为高风险,因为同一个地址出现在三份不同的泄露数据转储中,时间跨度从 2014 年 1 月 1 日到 2023 年 5 月 15 日。

三次泄露。首次与末次相隔九年。一个挂在 Google MX 上的免费 Gmail 账户。不是一次性邮箱,不是 catch-all,语法上合法。这种地址正是智能体会整天愉快地发送邮件的对象。

istrustedidentity 这个综合字段,正是让这个 API 作为守门员变得有趣的关键。它不仅验证可达性,还把泄露状态和一次性邮箱检测一并纳入。你无法仅凭公开文档轻易复现这一点,因为权重很关键:一次泄露就足以拦截吗?两次?三次?该 API 在这里做出了判断:拒绝。这是一个被包裹在字段里的策略决策,而这正是我希望放在智能体和邮件发送器之间的东西。

provider 和 mxrecord 提供了路由身份信息。对于 test@gmail.com,provider ID 是 Google,MX 解析到 gmail.com。这超出了验证本身的用途。在 B2B 线索评分流程中,isfree_email: true 是一个负面信号;在消费者注册流程中,它是中性或正面信号。该 API 提供了 provider 分桶,让你可以按工作流自行决定,而不是硬编码一份域名列表。

iscatchall 在这里是 false,但当它为 true 时,SMTP 检查基本上就是在对你撒谎。catch-all 服务器接受所有收件人,因此 smtp_verified 变得毫无意义。仅信任 SMTP 的智能体会向 not-a-real-user@catchalldomain.com 发送邮件,并认为发送成功了。当 catch-all 为 true 时,守门员需要降低 SMTP 权重。

syntax_suggestion 对这个地址返回 null,这很合理——test@gmail.com 拼写正确。但这一特性对智能体工作流很重要,因为智能体不会修正拼写错误。人类看到 gmial.com 会纠正它;智能体看到一个看起来合法的字符串就直接发送。该 API 会把 gmail.com 作为针对该拼写错误的建议返回。这是退信之前给到的第二次机会。

灰名单(greylisting)检测在 Gmail 上也没有触发,但它是我希望加入流程的另一层。有些邮件服务器会临时拒绝首次投递以减缓垃圾邮件发送者。一个急躁的智能体可能将这种延迟解读为硬性失败,或者更糟——频繁重试导致被限速。知道某个域名会启用灰名单,可以让你安排发送节奏,而不是在同一时间窗口暴力强发。

因此数据讲述了一个清晰的故事:test@gmail.com 可达,但不可信。智能体看到的是可达。守门员看到的是可信。十二次退信之后,我站到了守门员这一边。 为什么 SMTP 探测远远不够

下面这句话我不打算再含糊其辞:对于智能体邮件工作流,仅靠 SMTP 验证被高估了。它是一个有用的信号,但不是发送许可。

问题不在协议本身,而在于智能体如何使用这个信号。像 Muse Glimmer 这样的本地智能体模型是为始终在线、函数调用型工作流而构建的。Docker Sandbox 为编码智能体提供了可丢弃、隔离的环境来运行工具。qm 正在构建一个多智能体协作框架,让多个智能体协同完成工作。贯穿其中的共同主线是更高的自主权、更少的人工介入。这本身很好,直到智能体拿起一个邮件发送器开始大规模群发。

让我感到紧张的,是近期关于文档型 AI 蠕虫的报告。Håkon Måløy 的研究在与 Microsoft 进行 144 天协调期后披露,展示了如何通过一份 Word 文档中由攻击者控制的指令,借助 Copilot 生成的文档沿受信工作流传播。漏洞不仅仅在于单一恶意提示,而在于一连串受信操作会放大一次失误。邮件的形态完全相同。一次的错误发送不仅仅会退信——它会损害你的发送方信誉、污染你的名单卫生、触发 ESP 的速率限制,并在某些司法管辖区构成合规事件。智能体看不到任何这些二阶损害。

这就是我把“能否发送”和“是否应该发送”分开的原因。验证器的 istrustedidentity 字段是一个“是否应该发送”的信号。它表达的是:即便这个邮箱存在,该地址也出现在三份泄露数据转储中,那么在未做二次确认之前,或许不应将敏感内容发送过去。仅了解 SMTP 的智能体永远无法做出这种区分。

我仍然不确定拦截每一个已泄露地址是否是正确的做法。大量真实用户的旧账号都曾出现在泄露数据转储中。硬性拦截可能会排除合法用户。但对于一个没有人工审核的自主智能体,我宁愿偏向假阴性,也不想向我的 ESP 解释信誉崩溃的缘由。这种权衡是混乱的,而我让它保持混乱。

这也是我把守门员与更广泛的工具审计工作挂钩的原因。在之前一篇关于为域名调查构建 MCP 服务器的文章中,我遇到了五个围绕赋予智能体网络工具的安全陷阱。其模式完全相同:智能体不需要知道得更少;它需要一个独立的、懂得何时说“不”的层。最近我也在对比各家 API——我对十二个域名 WHOIS API 的评估告诉我,综合分数通常胜过原始字段堆叠。同样的逻辑在此同样适用。 我将在我的技术栈中做出的改动

守门员现在是任何由智能体触发的邮件离开我的基础设施之前的强制环节。不是可选。不是“锦上添花”。是强制。

这在实践中意味着: · 发送前验证。每封邮件在邮件发送器看到它之前都通过验证器。无例外。 · 不要单独信任 smtpverified。它需要与泄露状态、一次性邮箱检测和 catch-all 标志组合判断。如果 istrustedidentity 为 false,智能体会收到一个拒绝响应。 · 在边界自动纠正拼写。注册表单和 CSV 导入在地址进入工作流之前,将 syntaxsuggestion 反馈给用户或智能体。 · 按 provider 类型评分线索。isfreeemail 和 provider 字段用于 B2B 与 B2C 划分。@gmail.com 线索与 @company.com 线索得分不同。 · 尊重灰名单机制。群发邮件利用灰名单检测来安排重试,而不是在同一时段硬冲。 · 记录拒绝事件。每一个被拦截的地址,连同原因,写入取证日志。当出现问题时,我想知道是守门员过于严格,还是智能体过于急切。

实现本身很简单。一个围绕该 API 的 Python 封装。一个智能体可以解析的拒绝响应。一行日志。就这样。难的部分在于决定不允许智能体跳过它。

如果你想构建同样的东西,代码和文档在 GitHub 上,主机托管端点在 RapidAPI 上。我把 RapidAPI 订阅保持在按量付费计划,因为验证量会在产品发布期间出现峰值。 如何使用 Email Validator API

一个使用 curl 的最小调用看起来像这样:

以及我在守门员中运行的 Python 版本:

两者都返回我上面引用的完整 JSON。把 email 参数替换成你的智能体即将联系的对象即可。 我仍然无法回答的部分

8月12日那天,智能体也向一个被验证器标记的一次性域名发送了邮件。我事后才在日志里看到那个标记。它让我花了三小时清理名单,并被我的 ESP 临时限速。我从这次经历中没有得出什么漂亮的教训。有时候你是在事故之后才装上护栏的。

更大的悬而未决的问题是:在智能体技术栈中,谁拥有信任决策权。如果每个工具厂商都推出自己的验证器,我们最终会得到碎片化的策略:邮件工具说一套,数据库工具说另一套,浏览器工具又说第三套。也许我们需要的不是十几个守门员,而是一个单一的“工具使用风险评分”,智能体在任何外部动作前都去查询它。目前还没人构建出来。或者即使有人做了,我也没找到开源版本。

我所确定的是:在有什么东西像这样挡在它前面之前,我不会再运行带邮件发送器的智能体。12 次退信的代价是便宜的。下一失误未必。

如果你有一个空闲的周末,你会用邮件验证守门员来构建什么:一个自愈的新闻邮件列表、注册流程的一次性邮箱防火墙,还是更奇怪的东西?

译文由上游机器翻译生成,可能有误;判断请以英文原文为准。

英文原文(来源本站未改写)

ai, #api, #security, #sideprojects The 50-email experiment

On August 12, I handed an AI agent a CSV of fifty email addresses and an SMTP tool. Thirty-eight minutes later, twelve of them had bounced.

I wasn't trying to break anything. I was testing whether a local agent could handle a simple outreach task end-to-end: read a list, draft a short note, send it. The model I used was Muse Glimmer, Meta's 30-billion-parameter open-weights agent model that dropped on August 10, 2026. It's small enough to run on a single consumer GPU, which means agents like this are about to be everywhere—on your laptop, inside a Docker Sandbox, or wired into a multiplayer harness like qm. More tools, more autonomy, more chances for a bad send.

The agent saw send_email as just another function call. It didn't ask whether the addresses were real, reachable, or trustworthy. It pinged SMTP, got a handful of 250 OK greetings, and fired. One of those addresses was test@gmail.com. SMTP said yes. The gatekeeper I built afterward said no.

Here's the gatekeeper I wish I'd put in front of the mailer first:

When I ran that against test@gmail.com, SMTP came back verified. The composite trust score came back false. The agent would have sent. The gatekeeper didn't. What the gatekeeper actually saw

The response I got back is worth reading in full:

That's a lot of signal for one HTTP call. The first thing that jumps out is the contradiction: smtpverified is true, but istrusted_identity is false. If your agent is only checking SMTP, it treats this address as deliverable and moves on. The gatekeeper treats it as risky, because the same address has appeared in three separate breach dumps spanning from January 1, 2014 to May 15, 2023.

Three breaches. Nine years between the first and last. A free Gmail account on Google's MX. Not disposable, not catch-all, syntactically valid. The kind of address an agent would happily email all day.

The istrustedidentity composite is the detail that makes this API interesting as a gatekeeper. It doesn't just verify reachability; it folds in breach status and disposable detection. You can't easily reconstruct that from public docs alone because the weights matter: is one breach enough to block? Two? Three? The API made a call here and said no. That's a policy decision wrapped in a field, and it's exactly the kind of thing I want between an agent and my mailer.

provider and mxrecord give you routing identity. For test@gmail.com, the provider ID is Google and the MX resolves to gmail.com. That's useful beyond validation. In a B2B lead-scoring flow, isfree_email: true is a negative signal; in a consumer signup flow, it's neutral or positive. The API gives you the provider bucket so you can decide per workflow instead of hard-coding a list of domains.

iscatchall was false here, but when it's true the SMTP check is basically lying to you. A catch-all server accepts every recipient, so smtp_verified becomes meaningless. An agent that trusts SMTP alone will send to not-a-real-user@catchalldomain.com and think it succeeded. The gatekeeper needs to downgrade SMTP when catch-all is true.

syntax_suggestion was null for this address, which makes sense—test@gmail.com is spelled correctly. But the feature matters for agent workflows because agents don't fix typos. A human sees gmial.com and corrects it; an agent sees a valid-looking string and sends. The API would return gmail.com as a suggestion for that typo. That's a second chance before the bounce.

Greylisting detection didn't fire on Gmail either, but it's another layer I want in the loop. Some mail servers temporarily reject the first delivery attempt to slow down spammers. An impatient agent might interpret the deferral as a hard failure, or worse, retry aggressively and get rate-limited. Knowing a domain greylists lets you schedule the send instead of hammering it.

So the data tells a clear story: test@gmail.com is reachable, but not trustworthy. The agent saw reachable. The gatekeeper saw trustworthy. Twelve bounces later, I'm on the gatekeeper's side. Why an SMTP ping isn't enough

Here's where I stop hedging: SMTP verification alone is overrated for agentic email workflows. It's a useful signal. It is not a send permission.

The problem isn't the protocol. The problem is what an agent does with the signal. Local agent models like Muse Glimmer are built for always-on, function-calling workflows. Docker Sandboxes give coding agents disposable, isolated environments to run tools. qm is building a multiplayer harness so multiple agents can collaborate on work. The common thread is more autonomy, less human in the loop. That's great until the agent picks up a mailer and starts spraying.

The recent report on document-borne AI worms is what made me nervous. Håkon Måløy's research, disclosed after a 144-day coordination period with Microsoft, showed how attacker-controlled instructions in one Word document can propagate through Copilot-generated documents across trusted workflows. The vulnerability isn't just a single bad prompt; it's a chain of trusted actions that amplifies a mistake. Email is the same shape. One bad send doesn't just bounce. It dings your sender reputation, pollutes your list hygiene, triggers ESP rate limits, and in some jurisdictions creates a compliance event. The agent doesn't see any of that second-order damage.

That's why I separated "can send" from "should send." The validator's istrustedidentity field is a "should send" signal. It says: even if the mailbox exists, this address has been in three breach dumps, so maybe don't hand it sensitive content without a second look. An agent that only knows SMTP will never make that distinction.

I'm still not sure if blocking every breached address is the right call. Plenty of real humans have old accounts in breach dumps. A hard block could exclude legitimate users. But for an autonomous agent with no human review, I'd rather err on the side of false negatives than explain a reputation crash to my ESP. The tradeoff is messy, and I'm leaving it messy.

This is also why I linked the gatekeeper to my broader tool-audit work. In a previous post about building an MCP server for domain investigation, I hit five security gotchas around giving agents network tools. The pattern is the same: the agent doesn't need to know less; it needs a separate layer that knows when to say no. I've also been comparing APIs lately—my evaluation of twelve domain WHOIS APIs taught me that composite scores usually beat raw field dumps. The same logic applies here. What I'm changing in my stack

The gatekeeper is now mandatory before any agent-triggered email leaves my infrastructure. Not optional. Not "nice to have." Mandatory.

Here's what that means in practice: · Validate before send.Every email passes through the validator before the mailer sees it.No exceptions. · Don't trust smtpverified alone.It gets combined with breach status, disposable detection, and catch-all flags.If istrustedidentity is false, the agent gets a refusal. · Auto-correct syntax at the edge.Signup forms and CSV imports feed syntaxsuggestion back to the user or agent before the address enters the workflow. · Score leads by provider type. isfreeemail and provider feed B2B vs B2C segmentation.A @gmail.com lead gets a different score than a @company.com lead. · Respect greylisting.

Campaign sends use greylisting detection to schedule retries instead of brute-forcing the same window. · Log refusals.Every blocked address, with the reason, goes into a forensic log.When something breaks, I want to know whether the gatekeeper was too strict or the agent was too eager.

The implementation is small. A Python wrapper around the API. A refusal response the agent can parse. A log line. That's it. The hard part was deciding that the agent isn't allowed to skip it.

If you want to build the same thing, the code and docs are on GitHub, and the hosted endpoint is on RapidAPI. I keep the RapidAPI subscription on a pay-as-you-go plan because validation volume spikes around product launches. How to use Email Validator API

A minimal call looks like this with curl:

And the Python version I run in my gatekeeper:

Both return the full JSON I quoted above. Swap the email parameter for whatever your agent is about to contact. The part I still can't answer

On August 12, the agent also sent to a disposable domain that the validator had flagged. I saw the flag in the log after the fact. It cost me three hours of scrubbing the list and a temporary rate limit from my ESP. I don't have a tidy lesson from that one. Sometimes you ship the guardrail after the crash.

The bigger unresolved question is who owns the trust decision in an agent stack. If every tool vendor ships its own validator, we end up with fragmented policy: the email tool says one thing, the database tool says another, the browser tool says a third. Maybe what we need isn't a dozen gatekeepers but a single "tool-use risk score" that an agent consults before any external action. Nobody has built that yet. Or if they have, I haven't found the open-source version.

What I do know is that I won't run another agent with a mailer until something like this sits in front of it. The 12 bounces were cheap. The next mistake might not be.

If you had a free weekend, what would you build with an email-validation gatekeeper: a self-healing newsletter list, a disposable-email firewall for your signups, or something weirder?

出处https://dev.to/onizuka/i-ran-50-emails-through-ai-agents-12-smtp-bounces-hit-4jc抓取日期 · 采集源 DEV Community

03 / EVIDENCE GAPS

这条还缺什么证据?

下面每条都由本条已有字段推出(等级、理由、商业模式、来源次数、是否演示), 本站不生成推测性结论;通用验证方法放在方法论页。

  • 可核验的收入或付费证据查官网定价页与付费口径;第三方数据源(如 GetLatka)只作旁证,需标注来源与时点。
  • 只有单一来源找一手站点或其他渠道是否重复出现同一产品;社区热帖数量不等于商业进展。

通用验证清单(谁有这个问题/谁愿意付费/一个人能交付哪一小步)见我们的筛选方法。

04 / SIGNAL HISTORY

发现时间线