Firebase Cloud Function调用SendGrid发件显示已发送但未收到的排查求助
嘿,这种情况我在项目里碰过好多次,别着急,咱们一步步来排查根源:
排查步骤
1. 先查SendGrid后台的真实邮件状态
直接看Firebase日志只能知道函数调用了SendGrid接口,但没法确认邮件的最终走向。登录你的SendGrid控制台,找到Email Activity板块:
- 这里能看到每一封邮件的完整生命周期:是真的送达了,还是被拦截、退回,或者还在队列里?
- 重点看
Status列:如果显示Delivered,那问题大概率在收件端;如果是Blocked/Bounced,点击详情就能看到具体原因(比如收件邮箱不存在、你的域名在黑名单里)。
2. 检查收件邮箱的“隐藏文件夹”
很多时候邮件根本没丢,只是被邮箱服务商判定为垃圾邮件了:
- 先去收件箱的垃圾邮件、垃圾箱里翻一翻,有些邮箱还会把营销类邮件放到促销或社交文件夹里;
- 可以先把发件邮箱添加到收件人的联系人列表,再重新发送测试,能大幅降低被拦截的概率。
3. 验证Firebase与代码的细节配置
- 确认API Key正确性:在本地终端运行
firebase functions:config:get,检查返回的sendgrid.key是不是和SendGrid后台生成的API Key完全一致——别小看拼写错误或者多余空格,这很常见; - 检查邮件内容合规性:
- 发件人邮箱最好用经过SendGrid验证的域名(比如
noreply@yourdomain.com),避免被标记为伪造发件人; - 邮件主题和正文别包含容易触发垃圾邮件规则的关键词(比如“免费领取”“中奖”这类);
- 记得添加必要的邮件头,比如
List-Unsubscribe,这是邮箱服务商判断合规性的重要标准;
- 发件人邮箱最好用经过SendGrid验证的域名(比如
- 核对发送逻辑:你提供的代码片段只做了SendGrid初始化,没看到实际的
sgMail.send()调用。确认这部分的参数有没有传对:to是不是正确的收件邮箱,from有没有符合要求,subject和text/html是不是正常赋值了。
4. 本地测试,排除Cloud Function环境问题
把发送邮件的逻辑单独抽出来,写个简单的本地Node.js脚本,用同样的SendGrid API Key发测试邮件:
- 如果本地能收到,那问题可能出在Firebase Cloud Function的触发逻辑或者环境配置上;
- 如果本地也收不到,那肯定是SendGrid的配置或者邮件内容本身的问题。
5. 深挖Firebase日志的细节
虽然日志显示“邮件已发送”,但可以再仔细看看:
- SendGrid返回的响应码是不是
202 Accepted?这个状态只是表示SendGrid接收了你的请求,不代表邮件已经送达; - 有没有隐藏的警告信息?比如函数执行时的环境变量异常,或者SendGrid返回的额外提示。
内容的提问来源于stack exchange,提问作者JackyBoi
相关产品推荐
相关产品推荐

