mailto协议仅能唤起本地邮件客户端并预填信息,无法自动发送;需严格url编码参数,支持to/cc/bcc/subject/body,多收件人用英文逗号分隔,不支持附件与自动发送。

用 mailto: 协议生成点击即发邮件的链接
HTML 本身不能直接发送邮件,但能通过 mailto: 链接触发用户本地邮件客户端(如 Outlook、Mail.app 或 Thunderbird)新建一封草稿。这是最轻量、兼容性最好的方案,无需后端或 API。
基本写法是:@#@#@#@#@#@#@#@#@#@0。点击后,系统会打开默认邮件程序,收件人已填好,其他字段(主题、正文等)可选填。
- 多个收件人用英文逗号分隔:
mailto:a@example.com,b@example.com - 添加主题:加
?subject=xxx,中文需 URL 编码(如%E4%BD%A0%E5%A5%BD) - 添加正文:用
&body=xxx,换行用%0D%0A(即\r\n的编码) - 支持
cc、bcc、to参数,但并非所有客户端都识别cc和bcc
mailto: 链接里带空格和特殊字符怎么处理
空格、中文、标点等非 ASCII 字符必须 URL 编码,否则链接会截断或失效。浏览器不会自动帮你编码 href 中的内容。
例如:mailto:test@example.com?subject=你好&body=请查收%0D%0A谢谢 是错的——你好 没编码,& 会被当成参数分隔符,导致 body 被忽略。
- 正确做法:用 JavaScript 的
encodeURIComponent()处理每段内容,再拼接 - 手动编码可用在线工具,或终端执行
python3 -c "import urllib.parse; print(urllib.parse.quote('你好'))" - 常见需编码字符:空格 →
%20,换行 →%0D%0A,中文 → 如%E4%BD%A0%E5%A5%BD - 注意:整个
href值不用全编码,只编码参数值部分(subject=后、body=后)
为什么点了 mailto: 链接没反应?常见原因
不是代码写错了,而是环境或配置问题。用户没装邮件客户端、浏览器禁用了协议处理、或 macOS / iOS 上默认没有关联应用,都会静默失败。
- Windows 用户若装了 Outlook 但没设为默认,可能弹出“选择应用”窗口然后卡住
- Chrome 在某些企业策略下会屏蔽
mailto:,显示Not allowed to launch 'mailto:' URLs错误 - iOS Safari 点击后可能跳转到 Mail App,但若用户从没登录 iCloud 邮箱,会提示“无法发送”
- 别依赖
onclick回调判断是否成功——mailto:是异步启动外部程序,JavaScript 无法监听结果
想绕过客户端、真把邮件发出去,该怎么做
mailto: 只是唤起本地程序,不发信。如果需要“用户点一下就发出邮件”,必须走服务端:前端提交表单 → 后端调 SMTP(如用 Node.js 的 nodemailer、Python 的 smtplib)→ 发送到目标邮箱。
- 不能用纯前端发——浏览器禁止直接连 SMTP 服务器,也绝不能把邮箱密码硬编码在 JS 里
- 第三方服务如 SendGrid、Mailgun 提供 API,但需后端中转,否则暴露 API Key
- 简易替代:用静态站点托管平台(如 Vercel)的 Serverless Function 接收 POST,再调 SMTP,避免自己运维邮件服务器
- 提醒:即使走后端,也要做基础校验(如
email格式、防重复提交、限频),否则容易被滥用来发垃圾邮件
真正要“发送”,从来不是 HTML 的事;HTML 只负责“发起请求”。那个被忽略的后端环节,才是关键。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











