mailto 链接仅启动默认邮件客户端并预填字段,无法自动发送;需严格 URL 编码参数,不支持附件,多收件人用逗号分隔,注意大小写及平台兼容性。

mailto 链接能触发发邮件,但不能自动发送
点击 mailto: 链接时,浏览器只负责把收件人、主题、正文等参数传给系统默认邮件客户端(比如 Outlook、Mail.app 或 Thunderbird),是否打开、是否填写完整、是否真点发送——全由用户决定。它不是 API,不走网络请求,也不受 CORS 或权限限制。
常见错误现象:mailto: 点击没反应,大概率是用户没装邮件客户端,或系统没设默认;也可能是链接里用了未编码的空格或特殊符号(比如中文、换行符),导致解析失败。
- 主题和正文中的空格必须用
%20,中文要用 UTF-8 编码后 URL 转义(如%E4%BD%A0%E5%A5%BD) - 换行符得写成
%0D%0A(CR+LF),只写\n会被忽略 - 避免在
subject或body中拼接用户输入,没过滤可能被用来构造恶意链接(比如注入额外收件人)
多个收件人、抄送、附件?别指望 mailto
mailto: 协议标准(RFC 6068)只明确支持 to、cc、bcc、subject、body 这五个参数。所谓“附件”根本不在协议范围内——没有任何浏览器或邮件客户端会通过 mailto 自动加载本地文件。
使用场景:适合快速跳转到草稿页,比如「反馈问题」按钮、客服联系入口。不适合需要预填结构化数据、带文件、或强制走某邮件服务的流程。
-
cc和bcc参数可用,但部分客户端(尤其是 Web 版邮箱)会直接忽略bcc - 多个收件人用英文逗号分隔,不要加空格:
mailto:one@example.com,two@example.com - 参数顺序无关,但建议把
to放最前,方便调试;所有参数用?开头,后续用&连接
URL 编码不处理好,链接当场失效
浏览器对 mailto: 的解析比普通 URL 更脆弱。一个没编码的空格、一个未转义的问号,都可能导致整个 body 截断,甚至参数错位。
示例:这个链接看起来没问题,但实际点开会丢掉后面所有内容:mailto:test@example.com?subject=Hello&body=Hi there!
因为 ! 虽然常见,但严格来说不是 unreserved 字符,某些环境会出问题;更危险的是 Hi there! 里的空格。
- 安全做法:所有非字母数字字符,统一过一遍
encodeURIComponent()(JavaScript)或对应语言的 URL 编码函数 - 特别注意:
@、/、?、=、&在参数值里必须编码,但在 URL 结构位置(如mailto:后、?前)不能编码 - 测试技巧:把生成的链接粘贴进地址栏,看浏览器地址栏显示是否“干净”——没有乱码、没被截断、参数名没变成乱七八糟的键
移动端点击无响应?检查 href 和协议写法
iOS Safari 和部分安卓浏览器对 mailto: 的支持较保守。最常踩的坑是链接写成了 href="mailto:test@example.com" 但外层被 event.preventDefault() 拦了,或者用了伪协议(如 javascript:void(0))覆盖了原生行为。
另一个隐蔽问题是协议名大小写:MAILTO: 或 Mailto: 在某些旧版 WebView 里不认,必须小写 mailto:。
- 确保
a标签有真实href属性,且以小写mailto:开头 - 避免在
onclick里调event.preventDefault(),除非你明确要自己处理(那基本就不用mailto了) - 如果页面用了 PWA 或某些 SPA 路由库,检查是否劫持了所有
a标签跳转——mailto:必须放行
邮件链接看着简单,但每个参数、每个字符、每个平台响应逻辑都得对得上。最容易被忽略的,是把它当成“能发邮件的接口”——它只是个快捷启动器,背后没服务器、没状态、没回执。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











