提交表单到邮箱
浏览器或一小段脚本如何把表单提交到邮箱:access key、JSON 回复、重定向,以及不能进入邮件的字段。
人们搜索“把表单提交到邮箱”,通常是因为表单已经存在。字段有名字,按钮能点,缺的是一个接受 POST 并把它变成邮件的地址。这篇就是那个地址,以及周围的规则。

请求
向 https://getformpost.com/api/submit 发送 POST。正文可以是 application/x-www-form-urlencoded、multipart/form-data,或值仅为字符串、数字、布尔的 JSON 对象。数组和嵌套对象会被跳过。文件会被跳过。正文必须低于大小上限,并且除了 key 之外至少要有一个可见字段。
下面的 HTML 会跟着变。不用改代码。
HTML
<form action="https://getformpost.com/api/submit" method="POST">
<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY" />
<input type="hidden" name="_subject" value="新的项目咨询" />
<input type="email" name="email" required />
<textarea name="message" required></textarea>
<button>发送</button>
</form>access_key 选择收件箱。_subject 设置主题,换行会被去掉,长度有上限。email(或 from)在它是单个普通地址时成为回复地址。带换行的值会被忽略,这样字段就不能追加额外的邮件头。
“用表单发邮件”是同一次请求。搜索框里的词不同,POST 相同。用一个页面、一个接口、一把 key。
JSON 客户端
fetch 应该要求 JSON。设置 accept 头,或发送 _reply=json,或使用 Content-Type: application/json。任一条件都会返回 { "success": true, "message": "...", "data": { "id", "email" } },并且不会重定向。email 是 sent、logged 或 failed。logged 表示投递还没接通,消息留在提交列表里。failed 表示这一行已保存,投递返回了错误。仪表盘两种都会列出。

下面的 HTML 会跟着变。不用改代码。
JavaScript
await fetch('https://getformpost.com/api/submit', {
method: 'POST',
headers: { 'content-type': 'application/json', accept: 'application/json' },
body: JSON.stringify({
access_key: 'YOUR_ACCESS_KEY',
email: 'ada@example.com',
message: '你好',
_reply: 'json',
}),
});不要把 access key 放在查询字符串里,放在正文里。如果留言可能包含电话或私人细节,也不要在你自己的统计脚本里记录完整正文。接口保存它,是因为你要求保存。统计脚本不需要第二份。

重定向
没有 JSON accept 头的传统表单,会在收件箱保存了感谢页地址时跳到那里。保存的值必须是 https,或 localhost 上的 http。POST 本身不能提供另一个地址。隐藏的 redirect 输入会被忽略。这能防止被复制的表单把访客送到你不拥有的网站。
如果没有保存地址,访客会看到一页简短确认,并有回到 网站联系表单 的链接。表单放在营销站上时,用你自己主机上的真正感谢页。感谢对方,说明你何时回复,不要再让他们提交一次。

你会故意碰到的限制
蜜罐字段是 botcheck、_honey 和 _gotcha。其中任何一个非空,响应都说成功,并且不存储、不发信。在表单里留一个隐藏的,不要给它一个人会填写的标签。
同一 IP、同一把 key,两次提交之间要等几秒。立刻再提交会得到 429。等一下再试。免费方案超过每月额度后仍会保存并锁定,字段邮件不会发出。Pro 超过自己的额度会返回 429,并且不保存。免费方案每个 UTC 月保存 100 条。数字也写在 免费联系表单 页。付费订阅提高上限。价格是目录价格,不是表单里的数字。
未知 key 返回 400。只有 key、没有其他字段的正文返回 400,因为没有东西可寄。蜜罐命中返回 200。把 200 当成“访客已经完成”,把仪表盘当成“留言是否存在”。

邮件里有什么
邮件把每个公开字段列成 name: value。不含 access key,不含蜜罐。对方填了真实地址时,你可以从邮件程序直接回复。如果邮箱空着,其他字段仍在仪表盘里,只是没有可回复的人。
表单发到邮箱 用一次阅读讲完产品。HTML 联系表单发到邮箱 是同一次请求的可复制版本。本页是约定:哪些头、哪些状态码、哪些字段被保留。
可以从静态生成器、手写页面或几行 fetch 调用这个接口。除非你有理由藏起 key,否则不必再做一个后端去转发。在你运营的服务器里藏 key 是合理的。在客户端包里藏 key 并不是藏。页面一旦发布,key 就是公开的。
用测试收件箱的 key 从脚本提交,并把通知地址指到你控制的邮箱。公开的演示 key 会接受提交并记日志。它不会投递到你的私人地址,这正是任何人都能按的演示该有的行为。