使用Firebase触发邮件扩展发送邮件时出现SSL版本号错误
错误原因
这个SSL错误的本质是邮件客户端尝试建立TLS加密连接时,收到的对端响应不符合TLS协议规范,和SMTP账号、密码配置本身无关。你提到邮件记录可以正常写入数据库,说明函数核心逻辑运行正常,问题仅出在和SMTP服务建立网络连接的环节,在Firebase Functions场景下最常见的触发原因有3个:
- 端口配置和加密模式不匹配:比如配置了
secure: true(强制直连SSL),但填的是明文/STARTTLS专用的25、587端口;或者反过来配置了secure: false,但填了SSL直连专用的465端口。 - Firebase Functions免费套餐出站网络限制:Spark免费套餐下,所有指向非Google自有服务的出站请求都会被平台拦截,拦截返回的是纯文本提示内容,不是合法的TLS握手响应,就会触发这个版本号错误。而写入数据库走的是Firebase内部服务,不受该限制影响,和你观察到的现象完全吻合。
- TLS版本不兼容:部分老旧SMTP服务仅支持TLS1.0/1.1,而Firebase Functions默认使用的Node.js 16+运行时已经默认禁用了这两个低版本TLS协议,握手时会直接失败。
解决方案
按优先级逐一排查修复即可:
- 核对SMTP加密模式与端口匹配关系
如果你使用Nodemailer作为邮件发送库,严格遵循以下配置规则:- 使用465端口发信时,必须设置
secure: true - 使用25、587端口发信时,必须设置
secure: false,需要加密的话可以额外开启STARTTLS强制加密,参考配置:
const transporter = nodemailer.createTransport({ host: "你的SMTP服务地址", port: 587, secure: false, requireTLS: true, auth: { user: "你的SMTP账号", pass: "你的SMTP授权码" } }) - 使用465端口发信时,必须设置
- 检查Firebase套餐权限
Spark免费套餐不支持调用第三方外部服务,如果你当前使用免费套餐,需要升级到Blaze按需付费套餐,才能正常发起对第三方SMTP服务的出站连接。 - 兼容低版本TLS配置(仅用于排查或老旧SMTP场景)
如果确认端口、套餐配置均无误,可以在传输配置中显式放开TLS版本限制,临时关闭证书校验排查问题:
注意:const transporter = nodemailer.createTransport({ host: "你的SMTP服务地址", port: 465, secure: true, auth: { user: "你的SMTP账号", pass: "你的SMTP授权码" }, tls: { minVersion: "TLSv1", rejectUnauthorized: false } })rejectUnauthorized: false会跳过SSL证书有效性校验,存在中间人攻击风险,仅建议临时排查问题使用,生产环境请确认SMTP服务证书有效性后移除该配置。
内容的提问来源于stack exchange,提问作者philowe
相关产品推荐
相关产品推荐

