使用Cloud Functions和Nodemailer发送邮件无法收信问题求助
Cloud Functions + Nodemailer 邮件发送失败排查点
以下是你代码和配置中可能存在的问题,按出现概率从高到低排列:
- Gmail SMTP 授权配置错误
2022年起Gmail已不再支持第三方应用直接使用账号主密码登录SMTP服务,你需要先完成两个配置:- 为你的Gmail账号开启两步验证
- 生成16位的应用专用密码,替换代码中
pass字段的原有账号密码
- 入参取值逻辑不匹配请求方式
你当前使用request.query获取参数,仅适用于GET请求、参数拼接在URL后的场景。如果你的前端联系表单使用POST提交,参数存放在请求体中,需要将取值逻辑改为request.body。可在函数中添加日志打印参数值,在Firebase Cloud Functions日志面板确认是否能正常拿到sender、phone、message三个参数,参数为空会直接导致邮件发送失败。 - 回调逻辑存在缺陷
你当前的发送回调中,错误分支执行response.send后没有终止执行,会继续执行后续的response.send导致重复返回响应,可能造成云函数提前被回收、发送逻辑未执行完成。修复后的代码参考:transporter.sendMail(mailOptions, (err, info) => { if (err) { console.error('发送错误:', err); return response.status(500).send(err.toString()); } return response.status(200).send('Email sent'); }); - Firebase 套餐权限限制
如果你使用的是Firebase Spark免费套餐,默认禁止发起Google服务外的出站网络请求,无法调用Gmail SMTP接口,需要升级到Blaze付费套餐才可使用对外请求能力。 - 发件人配置触发反垃圾规则
Gmail SMTP不允许代发非当前账号所属的邮箱地址,你直接将用户提交的邮箱作为from字段值,会被SPF/DKIM校验拦截,甚至直接触发发送失败。建议将from字段改为你自己的Gmail邮箱,新增replyTo: sender.toLowerCase()配置,既可以避免拦截,收到邮件后点回复也能直接回给提交反馈的用户。
内容的提问来源于stack exchange,提问作者Daniel Corona
相关产品推荐
相关产品推荐

