把表单发到邮箱,网站上不必自建邮件服务器
表单发到邮箱,指的是表单唯一的工作就是落进邮箱。HTML 所在的主机不必跑邮件守护进程。你需要一个接收 POST 的 URL、一把标明收件箱的密钥,以及这个 URL 后面的邮件服务。这一页就是那个能用的 URL。
把 action 指到接口
form 的 action 设为 https://getformpost.com/api/submit,method 设为 POST。用隐藏字段带上仪表盘里的访问密钥。其余字段属于你。
藏一个蜜罐
加一个名为 botcheck 的输入并用 CSS 隐藏。人会跳过它。脚本会填它。蜜罐有值时,在发送任何邮件之前就会丢掉。
选择跳转或 JSON
如果浏览器在普通提交后应该打开感谢页,就保存那个 URL。脚本想要状态对象时,发送 Accept: application/json,或把 _reply 设为 json。
下面的 HTML 会跟着变。不用改代码。
HTML
<form action="https://getformpost.com/api/submit" method="POST">
<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY">
<label>
姓名
<input type="text" name="name" required>
</label>
<label>
邮箱
<input type="email" name="email" required>
</label>
<label>
留言
<textarea name="message" required></textarea>
</label>
<input type="text" name="botcheck" tabindex="-1" autocomplete="off" style="display:none" aria-hidden="true">
<button type="submit">发送</button>
</form>请求里有什么
接口接受 application/x-www-form-urlencoded、multipart 表单和 JSON 对象。每个文本字段变成邮件里的一行。访问密钥、蜜罐、跳转和 _reply 标记会被用掉,不会抄进邮件。字段名必须以字母开头并保持简短。值会被修剪并限制长度,避免一次提交把一兆字节倒进邮箱。文件部分会被跳过。需要附件的表单应该用带文件存储和扫描的产品,而不是免费的邮件转发。

如何决定投递
密钥匹配收件箱之后,服务器在本月计数里占一个名额。这次占位是一条更新,因此同一时刻的两次提交不能都靠过期的读取混过去。免费方案超过包含额度的提交仍会保存并标成锁定,字段邮件会跳过。Pro 超过 5000 条会被拒绝。额度以内会写入记录再发邮件。如果还没接通邮件投递,消息留在提交列表里,仪表盘状态为 logged。这样你可以在信件真正寄出之前,先确认表单能发到邮箱。如果投递返回错误,记录保留为 failed,JSON 会说明已保存但邮件没有发出。

Reply-To 和主题
如果提交包含一个普通的 email 或 from 地址,该地址成为 Reply-To。换行会被拒绝,避免它追加额外的邮件头。主题来自 _subject、subject,或包含收件箱名称的默认值。正文按到达顺序列出其余字段。字段名用你在邮件客户端里想看到的词:name、email、message。

为什么跳转锁在仪表盘里
密钥是公开的,陌生人可以 POST。如果这次 POST 能把 Location 设成任意 URL,这个主机就会变成开放跳转。感谢页地址由已登录的所有者保存在收件箱上。正文里的 redirect 字段不能改主机。浏览器导航得到 303。JSON 客户端永远不会被跳转,fetch 可以显示自己的确认。用 curl 时,Accept 为 text/html 能看到 303,为 application/json 能看到对象。

让邮箱还能用的限制
每个 IP 和每把访问密钥每隔几秒只能提交一次。免费账户每个 UTC 月可以存 100 条,额度内的每一条都会发信。Pro 提到 5000。上限是为了避免泄漏的密钥把你的地址变成消防水管。免费方案超过额度的提交会保存并锁定,字段邮件不会发出。Pro 超过 5000 仍返回 429,并且不保存。到免费联系表单升级,或等到下个月。首页把同一个接口写成网站联系表单。

这不是名单
除非你自己保存同意记录,并且真的用正规名单工具发信,否则不要用它收集新闻信订阅。我们不会把人加入受众,也不会追踪打开。仪表盘是账户所有者的表单日志。如果访客要求删除某条消息,从你的邮箱里删掉它。隐私页说明账户保存什么。表单发到邮箱应该保持为一封信,而不是一次你没说明的注册。
接下来
如果页面是一个联系框,从网站联系表单和它的代码片段开始。如果要替换 PHP mail 脚本,读用 PHP 把 HTML 表单发到邮箱。如果要一份没有框架的静态主机标记,读HTML 联系表单发到邮箱和提交表单到邮箱。
常见问题
这个查询下常见的教程是一段 PHP mail()、一个 WordPress 插件,或一个顺便把人加入名单的营销表单。那些是不同的工作。静态文件上的表单发到邮箱,不该引入一套 CMS,也不该要求访客变成一条联系人记录。