uni-app发邮件需分场景:App端用plus.messaging调系统邮件客户端(仅5+App支持);全平台推荐uniCloud云函数+SMTP(需配置白名单、授权码及超时);H5/APP可用mailto链接(无附件、需编码参数)。

uni-app 本身没有内置邮件发送能力,必须借助外部服务:要么调用设备原生邮件客户端(仅限 App 端),要么走云函数 + SMTP 服务(全平台可用)。直接在前端用 nodemailer 是不可能的——它不能在浏览器或小程序运行时环境执行。
App 端调起系统邮件应用(plus.messaging)
这是最轻量、无需后端的方式,但只在 5+ App(即 HBuilderX 打包的原生 App)中有效,微信小程序、H5、快应用都不支持。
-
plus.messaging需要启用 Native.js 支持,且仅 Android/iOS 可用;iOS 上部分邮箱 App(如 Outlook)可能不响应预填字段 - 收件人、主题、正文可预填,但附件必须是本地文件路径(如
_doc/xxx.pdf),且需先用uni.downloadFile或plus.io写入沙盒 - 不能控制发送结果(成功/失败无回调),用户点“发送”前可随时取消
- 示例调用:
plus.messaging.open({to: ['user@example.com'], subject: '验证邮件', body: '您的验证码是:1234'}, (e) => { console.log('已打开邮件界面') });
微信小程序用云开发发邮件(uniCloud + nodemailer)
这是目前唯一能覆盖微信小程序、H5、App 的稳定方案,但依赖云函数部署和 SMTP 配置。关键不是“怎么写”,而是“怎么让云函数正确打包并访问网络”。
-
/cloudfunctions目录默认不会被 uni-app 构建流程包含,必须手动用copy-webpack-plugin@5.1.1复制到unpackage/dist/dev/mp-weixin/cloudfunctions(开发态)或对应 build 路径 - 云函数内使用
nodemailer时,secure: true对应端口 465,secure: false则必须配requireTLS: true并用端口 587;QQ 邮箱必须用授权码(非登录密码),且 POP3/SMTP 服务需在邮箱设置里手动开启 - 微信小程序云环境默认禁止外网出向请求,需在云开发控制台「安全配置」中将 SMTP 域名(如
smtp.qq.com)加入「HTTP 访问白名单」 - 云函数超时默认为 5 秒,发邮件建议设为
timeout: 15000,否则容易因网络延迟返回function timeout
使用 uni-link 触发 mailto 链接(H5 / App 有限支持)
这是最简单但功能最弱的方式,本质是生成一个 mailto:xxx@xx.com?subject=xxx&body=xxx 链接,由系统浏览器或邮件 App 解析打开。
-
uni-link在微信小程序中会被拦截(不支持mailto:协议),H5 下依赖浏览器支持,App 端表现取决于系统默认邮件 App 是否识别参数 - 主题(
subject)和正文(body)中的空格、换行、中文必须encodeURIComponent编码,否则截断或乱码 - 无法携带附件,也不能判断用户是否实际发送了邮件
- 示例:
<uni-link :href="'mailto:' + encodeURIComponent('test@example.com') + '?subject=' + encodeURIComponent('验证') + '&body=' + encodeURIComponent('验证码:6789')" text="发邮件"></uni-link>
真正卡住人的往往不是代码怎么写,而是云函数没被打包进去、SMTP 白名单漏配、QQ 邮箱授权码填错、或者在微信开发者工具里测试却用了测试号(无云开发权限)。这些地方一错,日志里连错误都看不到——函数根本没运行。


















