Firebase免费部署后Node.js Nodemailer出现ENOTFOUND错误求助
你遇到的getaddrinfo ENOTFOUND错误,核心原因其实是Firebase免费套餐(Spark计划)的网络限制,而非Node.js或Nodemailer本身的问题,我来帮你拆解原因和解决方案:
为什么本地正常,部署后出错?
本地运行firebase serve时,代码用的是你本地环境的网络,没有Firebase云函数的访问限制,所以能正常解析smtp.ethereal.email并建立连接。但部署到Firebase免费版云函数后,Spark计划禁止云函数发起对非Google服务的外部网络请求,导致DNS无法解析第三方SMTP服务器域名,从而抛出这个错误。
可行的解决方案
升级到Firebase Blaze计划(按需付费)
Blaze计划取消了外部网络请求的限制,允许云函数访问任何公开的互联网服务,包括Ethereal的SMTP服务器。这个计划有免费额度(每月前200万次云函数调用、5GB带宽等),测试场景下基本不会产生费用,是最直接的解决办法。切换到Google原生邮件服务(无需升级套餐)
如果你不想升级,可以改用Google自家的邮件服务,比如Gmail(需要启用应用专用密码,且注意Gmail的发送限制)或Google Workspace邮箱。因为这些属于Google生态内的服务,免费套餐的云函数可以正常访问,配置Nodemailer时只需要替换SMTP参数为对应的Google服务器信息即可。额外调试建议(升级后仍有问题时)
如果升级Blaze计划后还是遇到解析问题,可以在云函数中添加DNS调试代码,确认域名是否能正常解析:const dns = require('dns'); dns.resolve('smtp.ethereal.email', (err, addresses) => { if (err) console.error('DNS解析失败:', err); else console.log('解析到的IP:', addresses); });同时检查Nodemailer的SMTP配置是否完全正确,比如主机名、端口(587是正确的)、认证账号密码是否和Ethereal提供的一致。
内容的提问来源于stack exchange,提问作者ravo10

