mailto:协议仅能唤起系统邮件客户端而非自动发送,所有“发送成功”回调实为唤起成功;需url编码参数,ios对body长度敏感(超2000字符易截断),h5平台不支持,须平台判断。

不能自动发送,只能唤起系统邮件客户端;所有“发送成功”回调实际只是“唤起成功”,不是邮件真正发出。
用 mailto: 协议唤起邮件 App(最通用)
这是唯一无需插件、全平台(App 端 Android/iOS)都支持的方式。本质是构造一个标准 URL,交给系统处理。
- 必须用
uni.navigateTo({ url: 'mailto:...' }),不能用uni.redirectTo或uni.reLaunch,否则在非页面路径下行为未定义,容易失败 - 参数必须 URL 编码:
subject和body中的中文、空格、符号都要过encodeURIComponent(),否则 iOS 可能静默忽略整个 body - iOS 对
body长度敏感,超 2000 字符大概率被截断;Android 更宽容,但华为 EMUI 等定制 ROM 可能直接丢弃 body - H5 平台不支持
mailto:,调用会报错,务必提前判断:if (uni.getSystemInfoSync().platform === 'app')
用 plus.messaging.createMessage(仅限 5+ App)
这是 DCloud 原生增强方案,比 mailto: 更可控,支持附件和更明确的失败回调,但只适用于 manifest.json 中启用“使用原生引擎”的 5+ App。
- 调用前必须检查:
if (typeof plus !== 'undefined' && plus.messaging),且建议放在onLaunch后或首次点击时加延迟/重试 - 附件只接受本地路径(
_www或_doc开头),网络 URL 必须先uni.downloadFile再uni.saveFile保存到本地 - Android 上若无邮件 App 安装,
sendMessage会进fail回调;iOS 则可能弹“无可用应用”,无法静默降级 - 该 API 在微信小程序、H5、快应用等平台完全不可用,跨平台时必须用
#ifdef APP-PLUS条件编译包裹
富文本中邮箱点击失效?别用 rich-text 直接绑 @tap
rich-text 组件对自定义事件支持极弱,@tap 不会冒泡到邮箱节点,data- 属性也会被过滤,在 App 端根本不会响应点击。
- 正确做法:预处理 HTML 字符串,用正则提取所有邮箱,替换成带
data-email的<span></span>或<a></a>标签,再绑定父容器的@tap,通过event.target.dataset.email拿值 - 或者换用
mp-html插件(截至 2026 年 6 月仍支持),利用其handleLink钩子拦截mailto:链接并手动处理 - 千万别在
rich-text里写<a href="mailto:..."></a>并指望它自动唤起——它在 App 端就是死的
真正容易被忽略的是:唤起 ≠ 发送。用户点“发送”后你收不到任何投递状态,也无法知道邮件是否进入对方收件箱。如果你的业务强依赖“已送达”,就得换思路——比如走云函数发 SMTP 邮件,或引导用户复制内容粘贴到邮件客户端手动发送。











