Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinese邮件
Each autark user has their own AgentMail inbox provisioned at onboarding. All mail — sends, replies, inbox reads — goes through the CLI, which is already authenticated via . Do not call directly. Do not use the npm CLI.
autark mail~/.autark/credentials.jsonapi.agentmail.toagentmail每个autark用户在入职时都会获得专属的AgentMail收件箱。所有邮件操作——发送、回复、读取收件箱——均通过 CLI完成,该工具已通过完成身份验证。请勿直接调用。请勿使用 npm CLI。
autark mail~/.autark/credentials.jsonapi.agentmail.toagentmailAuth
身份验证
autark mail~/.autark/credentials.jsonmissing agentmail_tokenautark mail setup --prefix <name>AGENTMAIL_API_KEYAGENTMAIL_EMAILAGENTMAIL_INBOX_IDautark mail~/.autark/credentials.jsonmissing agentmail_tokenautark mail setup --prefix <name>如果环境中设置了 / / ,它们将作为覆盖值生效——仅在使用非默认收件箱时有用。
AGENTMAIL_API_KEYAGENTMAIL_EMAILAGENTMAIL_INBOX_IDPlain text vs HTML — pick the right flag
纯文本 vs HTML——选择正确的参数
The CLI accepts both and , matching the AgentMail / Mailgun / SendGrid / Resend / Postmark convention.
--text--html- — ships as
--text @file. Recipient sees the bytes verbatim. Any HTML tags (text/plain,<div>,<p>,<br>, etc.) show up as literal text in the recipient's inbox.<a> - — ships as
--html @file. Recipient's email client renders it as a styled email with real anchors, paragraph breaks, etc.text/html
The rule for outreach signatures: if you put a link in the signature / footer of the email, the link must be embedded in the word (e.g. the name "kushal" is itself the clickable link), never a bare URL on its own line. A bare-URL signature is not the shape autark sends.
To get an embedded-link signature, you have to use — would render the markup as literal text in Gmail / Outlook. This is what broke on 2026-05-28: 6 cold emails went out with in , and every recipient saw the raw markup in their Gmail. See for the postmortem.
--html--text<a href><a href="https://autark.sh">kushal</a>--textautark/docs/email-html-in-text-incident.mdIf your send doesn't have a signature link (signup verification, test pings, system messages), plain is fine.
--text该CLI支持和两种参数,与AgentMail / Mailgun / SendGrid / Resend / Postmark的约定一致。
--text--html- — 以
--text @file格式发送。收件人将看到原始内容。任何HTML标签(text/plain、<div>、<p>、<br>等)都会在收件人邮箱中显示为纯文本。<a> - — 以
--html @file格式发送。收件人的邮件客户端会将其渲染为带有真实链接、段落换行等样式的邮件。text/html
客户开发签名规则: 如果在邮件签名/页脚中添加链接,该链接必须嵌入到文字中(例如,“kushal”这个名称本身就是可点击的链接),绝对不能单独一行放置裸URL。autark不使用裸URL签名格式。
要实现嵌入链接的签名,必须使用参数——如果使用,标记会在Gmail/Outlook中显示为纯文本。这正是2026-05-28出现的问题:6封开发邮件使用参数发送,其中包含,所有收件人在Gmail中都看到了原始标记。详情请查看中的事后分析。
--html--text<a href>--text<a href="https://autark.sh">kushal</a>autark/docs/email-html-in-text-incident.md如果发送的邮件没有签名链接(注册验证、测试通知、系统消息),使用纯参数即可。
--textLint every draft before sending
发送前检查所有草稿
Run on every draft (sends and replies) before :
autark mail lintautark mail sendsh
autark mail lint --body @draft.txtExit 0 = clean. Exit 1 = violations printed as JSON, each with a , , and . Treat the output as feedback, not a gate. The rules catch common AI tells; they sometimes false-positive on a draft that's actually fine. Read each , judge whether the rule applies to your specific message, fix the ones that land, override the ones that don't. The bar isn't "lint exit 0" — it's "would this email land as a real human note?"
ruledetailwhywhyLint inspects content quality only — AI-tells, hedging, length, signature shape. It does not police markup mechanics (that's the convention above + your judgment). Lint the body you're about to ship: if you're sending , lint the html file; if you're sending , lint the text file. Lint reads prose either way.
--html--textWhat lint checks:
- structure-word — AI-tell vocabulary in the body (,
structurally,fundamentally,specifically,essentially,the key insight, etc.). Humans writing cold email don't reach for these. Describe the thing directly.that's exactly - em-dash — any character. Strong AI tell in outbound. Use commas, periods, or new line breaks. (Override if the recipient's own writing uses them and you're mirroring tone.)
— - body-url — any URL outside a markdown or HTML
[name](url)anchor. The product link belongs in the signature anchor; a bare URL mid-body reads as an A/B variant.<a href> - too-many-questions — more than one . Pick the single question that gives you the most signal. (Override fine for replies answering multiple direct asks.)
? - compound-question — "are you X or Y...?" patterns. Drop the and pick the more specific half.
or - too-long — >400 chars before the signature (~4–6 short lines). Past that you're explaining, not asking.
- no-anchor-sig — signature has no clickable name link. Without an /
<a href>in the sig, the recipient has no quick path to figure out who you are.[name](url)
If most violations land and you can't write a clean draft after 2 rewrites: the issue is upstream of the regex. Re-read and ask whether you should send at all.
~/.claude/skills/outreach/SKILL.md在执行之前,务必对所有草稿(发送和回复邮件)运行:
autark mail sendautark mail lintsh
autark mail lint --body @draft.txt退出码0表示检查通过。退出码1表示存在违规,将以JSON格式输出,每条违规包含、和字段。请将输出视为反馈而非强制要求。这些规则用于检测常见的AI生成痕迹;有时会对实际合格的草稿误报。请阅读每条内容,判断该规则是否适用于你的特定消息,修复适用的问题,忽略不适用的规则。标准并非“lint退出码为0”,而是“这封邮件看起来像是真人写的吗?”
ruledetailwhywhyLint仅检查内容质量——AI生成痕迹、措辞犹豫、长度、签名格式。它不会检查标记语法(这由上述约定和你的判断决定)。请对你即将发送的内容进行检查:如果使用发送,则检查HTML文件;如果使用发送,则检查文本文件。无论哪种格式,Lint都会读取文本内容。
--html--textLint检查的内容:
- structure-word — 正文中的AI生成特征词汇(、
structurally、fundamentally、specifically、essentially、the key insight等)。真人写开发邮件不会使用这些词汇。请直接描述内容。that's exactly - em-dash — 任何字符。这是 outbound 邮件中明显的AI生成痕迹。请使用逗号、句号或换行替代。(如果收件人自身写作风格使用该符号,且你需要匹配语气,则可以忽略该规则。)
— - body-url — 任何不在markdown 或HTML
[name](url)链接中的URL。产品链接应放在签名链接中;正文中的裸URL看起来像是A/B测试变体。<a href> - too-many-questions — 超过一个。请选择最能获取有效信息的单个问题。(如果是回复多个直接提问,则可以忽略该规则。)
? - compound-question — “are you X or Y...?”这类模式。请去掉,选择更具体的部分。
or - too-long — 签名前内容超过400字符(约4-6短行)。超过这个长度就变成解释而非询问了。
- no-anchor-sig — 签名中没有可点击的名称链接。如果签名中没有/
<a href>,收件人无法快速了解你的身份。[name](url)
如果大部分违规都适用,且经过2次重写仍无法写出合格草稿:问题出在规则之外。请重新阅读,并考虑是否应该发送这封邮件。
~/.claude/skills/outreach/SKILL.mdSend a message — cold outreach (html, embedded-link sig)
发送消息——客户开发(HTML格式,带嵌入链接签名)
sh
autark mail send \
--to person@example.com \
--subject "Subject" \
--html @./body.html \
--run-id $RUN_IDbody.htmlhtml
<p>Hi Karl,</p>
<p>one sentence quoting them.</p>
<p>one sentence on what you built.</p>
<p>one specific question?</p>
<p>best,<br><a href="https://autark.sh">kushal</a></p>Recipient sees a styled email with "kushal" as a clickable link to autark.sh. This is the default shape for any cold outreach send.
Always pass . With it, records the autark action itself (channel=email, recipient, thread_id, message_id, subject) so you don't need a separate . Without , the send still works but isn't tracked — only do that for non-outreach signups/login flows where there's no autark run.
--run-idautark mail sendautark log action--run-idOther flags: , , , , (each repeatable or comma-separated), to print the payload without sending, to override the auto-generated action title.
--cc--bcc--reply-to--label--attachment--dry-run--titleResponse is JSON with , , and (when was passed) . Save it.
message_idthread_id--run-idautark_action_idsh
autark mail send \
--to person@example.com \
--subject "Subject" \
--html @./body.html \
--run-id $RUN_IDbody.htmlhtml
<p>Hi Karl,</p>
<p>one sentence quoting them.</p>
<p>one sentence on what you built.</p>
<p>one specific question?</p>
<p>best,<br><a href="https://autark.sh">kushal</a></p>收件人将看到一封样式化的邮件,其中“kushal”是指向autark.sh的可点击链接。这是所有客户开发邮件的默认格式。
务必传递。 传递该参数后,会自动记录autark操作本身(channel=email、收件人、thread_id、message_id、主题),因此你无需单独执行。如果不传递,邮件仍会发送,但操作不会被记录——仅在非客户开发的注册/登录流程(无autark运行)中才这样做。
--run-idautark mail sendautark log action--run-id其他标志:、、、、(可重复使用或用逗号分隔)、用于打印负载但不发送、用于覆盖自动生成的操作标题。
--cc--bcc--reply-to--label--attachment--dry-run--title返回结果为包含、(若传递了则还包含)的JSON。请保存该结果。
message_idthread_id--run-idautark_action_idSend a message — non-outreach (plain text, no link)
发送消息——非客户开发(纯文本格式,无链接)
For signup verifications, test pings, system messages, or any send where there is no signature link to worry about:
sh
autark mail send \
--to verify@signup-form.test \
--subject "Subject" \
--text @./body.txtPlain is fine here. No because there's no autark run.
--text--run-id对于注册验证、测试通知、系统消息或任何无需担心签名链接的邮件:
sh
autark mail send \
--to verify@signup-form.test \
--subject "Subject" \
--text @./body.txt此处使用纯参数即可。无需传递,因为没有autark运行。
--text--run-idReply in a thread
回复线程中的邮件
sh
autark mail reply \
--message-id "$MESSAGE_ID" \
--html @./reply.html \
--run-id $RUN_IDSame shape rules: if your reply has a signature link, use . If you're answering a one-liner with a one-liner and no sig link, is fine.
--html--text$MESSAGE_IDmail sendmail messagemail threadUse to reply to all recipients, and to forward.
autark mail reply-allautark mail forward --message-id <id> --to <addr> [--html @body.html]sh
autark mail reply \
--message-id "$MESSAGE_ID" \
--html @./reply.html \
--run-id $RUN_ID格式规则相同:如果回复包含签名链接,请使用参数。如果仅用一句话回复一句话且无签名链接,使用参数即可。
--html--text$MESSAGE_IDmail sendmail messagemail thread使用回复所有收件人,使用转发邮件。
autark mail reply-allautark mail forward --message-id <id> --to <addr> [--html @body.html]Read inbox
读取收件箱
sh
autark mail threads [--limit 30] # list threads
autark mail thread <thread_id> # one thread + all messages
autark mail messages [--limit 30] # flat message list
autark mail message <message_id> # single message
autark mail raw <message_id> # full raw payload
autark mail attachment --message-id <id> --attachment-id <id> [--out file]JSON output throughout. No auth flags — credentials are read from disk.
sh
autark mail threads [--limit 30] # 列出邮件线程
autark mail thread <thread_id> # 查看单个线程及所有邮件
autark mail messages [--limit 30] # 平铺显示邮件列表
autark mail message <message_id> # 查看单封邮件
autark mail raw <message_id> # 查看完整原始负载
autark mail attachment --message-id <id> --attachment-id <id> [--out file]所有输出均为JSON格式。无需身份验证标志——凭据会从磁盘读取。
Escape hatch
应急方案
If AgentMail ships a new endpoint that doesn't wrap yet:
autark mailsh
autark mail request GET /inboxes/$EMAIL/some/new/endpoint
autark mail request POST /inboxes/$EMAIL/foo --body @payload.jsonReuses the same authenticated session. Use this only when no wrapped command fits.
如果AgentMail推出了尚未封装的新端点:
autark mailsh
autark mail request GET /inboxes/$EMAIL/some/new/endpoint
autark mail request POST /inboxes/$EMAIL/foo --body @payload.json该命令会复用已验证的会话。仅当没有合适的封装命令时才使用此方案。
Rules
规则
- For any send whose signature contains a link, use so the link is embedded in the name. Bare-URL signatures are not the shape autark sends.
--html - Plain is fine for sends without a signature link (signup verifications, system pings, test sends).
--text - Lint every draft (sends and replies). Treat the output as feedback, override the rules that don't apply.
- Pass on every outreach send/reply so the action lands in autark and the reply-state cron can detect engagement.
--run-id - Do not guess email permutations from name + domain. Use the skill before first contact — verify the address through a concrete source (Apollo, GitHub commits, etc.).
email-finder - If the contact is high value or the source is shaky, corroborate with a second signal.
- If an address hard-bounces, suppress it and move on. Don't try nearby guesses.
- If browser work is needed for signups, verification links, or Apollo research, use the skill.
chrome-relay - The response (or
autark mail sendpayload) is the canonical record —--dry-run+message_idare how you find replies later. If you passedthread_id, autark already stored them under the action.--run-id
- 任何签名包含链接的邮件,请使用参数,确保链接嵌入到名称中。autark不使用裸URL签名格式。
--html - 对于无签名链接的邮件(注册验证、系统通知、测试邮件),使用纯参数即可。
--text - 检查所有草稿(发送和回复邮件)。将输出视为反馈,忽略不适用的规则。
- 所有客户开发邮件的发送/回复均需传递,以便操作记录到autark中,回复状态定时任务可检测互动情况。
--run-id - 请勿通过姓名+域名猜测邮箱地址。首次联系前请使用技能——通过可靠来源(Apollo、GitHub提交等)验证地址。
email-finder - 如果联系人价值较高或来源不可靠,请通过第二种信号进行确认。
- 如果地址硬退信,请将其加入抑制列表并继续后续操作。请勿尝试相近的猜测地址。
- 如果注册、验证链接或Apollo研究需要浏览器操作,请使用技能。
chrome-relay - 的响应(或
autark mail send负载)是权威记录——--dry-run+message_id是你后续查找回复的依据。如果传递了thread_id,autark已将其存储在操作记录中。--run-id