uniapp app端可唤起系统邮件客户端但无法自动发送,仅支持mailto:协议或plus.messaging(5+ app),需平台判断、url编码、附件本地化,并处理唤起失败的降级方案。

UniApp App端调用系统原生邮件客户端,**能实现,但仅限于“唤起”而非“自动发送”**。你无法绕过用户确认界面,也不能控制邮件是否真正发出——这是 iOS 和 Android 系统强制的安全限制。所有“发送成功”回调,实际只是“唤起成功”,不是邮件投递成功。
mailto: 协议是唯一通用、无需插件的唤起方式
Android 和 iOS 均原生支持 mailto: URL Scheme,UniApp 可直接用 uni.navigateTo 打开它。注意:这不是跳转页面,而是触发系统拦截并交由默认邮件应用处理。
- 必须用完整协议格式,例如
mailto:test@example.com?subject=反馈&body=内容%20支持URL编码,参数需encodeURIComponent处理中文或特殊字符 -
uni.navigateTo({ url: 'mailto:...' })在 H5 平台会报错(不支持),需提前判断平台:uni.getSystemInfoSync().platform === 'app' - iOS 对
body参数长度敏感,超长可能被截断或忽略;Android 一般更宽容,但部分定制 ROM(如华为 EMUI)会静默丢弃body - 不要用
uni.redirectTo或uni.reLaunch,它们在非页面路径下行为未定义,容易失败
plus.messaging 是 DCloud 原生增强方案,但仅限 5+ App
如果你打包的是 DCloud 官方 5+ App(即 manifest.json 中启用 “使用原生引擎”),可调用 plus.messaging.createMessage。它比 mailto: 更稳定,支持预填 to、cc、subject、body、附件(EXTRA_STREAM),且失败回调更明确。
- 必须确保运行环境已加载
plus对象,可在onLaunch后加if (typeof plus !== 'undefined')判断 - 附件只支持本地文件路径(
_www或_doc开头),不能传网络 URL;图片需先uni.downloadFile再保存到本地 - Android 上若设备未安装任何邮件 App,
sendMessage会直接进fail回调;iOS 则可能弹出“无可用应用”提示 - 该 API 在微信小程序、H5、快应用等其他平台完全不可用,跨平台时务必包裹条件编译
#ifdef APP-PLUS
富文本中邮箱点击失效?别用 rich-text 直接绑定 tap
rich-text 组件对自定义事件支持极弱,@tap 不会冒泡到邮箱节点,data- 属性也会被过滤。直接写 <a href="mailto:..."></a> 在 App 端根本不会响应点击。
- 正确做法是:预处理 HTML 字符串,用正则提取所有邮箱,替换成带
data-email的<span></span>标签,再绑定父容器的@tap,通过event.target.dataset.email拿值 - 或者换用
mp-html插件(支持href事件拦截),并在其handleLink钩子中识别mailto:并手动唤起 - 切勿在
rich-text内写mailto:链接后指望它自动工作——它在 App 端就是摆设
真正容易被忽略的点是:**唤起失败几乎无法补救**。用户没装邮件 App、系统禁用了默认关联、甚至只是点了“取消”,前端都收不到区分性错误码。你能做的只有 fallback 提示 + 复制邮箱地址(uni.setClipboardData),然后告诉用户“已复制,请粘贴到邮件客户端手动发送”。别试图在 App 端模拟发送逻辑,那属于后端职责。











