你的发送请求可能在收件人手机收到任何内容之前就已成功。稍后的运营商报告会提供另一个结果,你的应用程序必须将其与请求接受分开处理。
送达回执告诉我什么?
回执从网络角度报告投递成功或投递问题。
SMS 投递结果可能在手机放在抽屉里无人查看时到达。它不能证明收件人看到了发送者身份,也不能证明他们阅读了完整的短信内容。
网络独立于对发送请求的响应来发送回执,也可能不发送某些报告。SMPP 回执参考记录了运营商连接的这些控制项。
Bird 公开哪些运营商回执?
你会收到已识别投递结果的公开事件。缓冲回执保留在内部。
缓冲回执表示运营商正在暂存该消息。Bird 将其记录在内部事件日志中,不会更改公开消息状态。你在公开时间线或 webhook 中看不到任何更新。
| 运营商回执状态 | Bird 事件 |
|---|---|
delivered | sms.delivered |
expired | sms.expired |
rejected | sms.rejected |
delivery_failed,可恢复原因 | sms.undelivered |
delivery_failed,永久性或未映射原因 | sms.failed |
buffered | 无公开事件 |
未识别的运营商状态不会产生事件。因此,缺少公开更新并不能证明运营商没有发送回执。
为什么同一个失败状态会产生不同的事件?
Bird 根据运营商的失败原因判断底层问题是否可能消除。
| 运营商原因 | Bird 错误码 | 分类 |
|---|---|---|
unavailable_subscriber | unreachable | 可恢复 |
received_network_error | provider_unavailable | 可恢复 |
capacity_limit_reached | provider_unavailable | 可恢复 |
unknown_subscriber | invalid_destination | 永久性 |
opted_out | recipient_opted_out | 永久性 |
carrier_rejected | sender_unregistered、content_rejected 或 blocked_by_carrier | 永久性 |
可恢复的失败产生 sms.undelivered。该消息仍然是终态:Bird 不会自动重试。要将消息送达收件人,需要在底层问题消除后再次发送。
永久性失败会产生 sms.failed。
SMS pumping 是一种欺诈行为,它让你的产品向攻击者控制的号码发送付费消息。Bird 在欺诈保护拦截疑似 pumping 时报告 blocked_by_fraud_protection。
其他未映射的原因会产生 sms.failed,错误代码为 unknown。该结果表示 Bird 无法对运营商的原因进行分类,并不能独立证明目标地址永久不可达。
我能设置运营商何时停止尝试投递吗?
你可以通过 validity_period 设置投递截止时间,范围为 60 至 172800 秒(两天),从 Bird 接受该消息时开始计算。
超过该截止时间后,Bird 不会再将消息交给运营商。在路由支持的情况下,Bird 会将剩余时间作为消息的有效期传给运营商。有效期为十分钟的验证码可以将其设为 600,这样十分钟内未到达运营商的短信就不会被发送。
在到达运营商之前就错过截止时间的消息,最终状态为 rejected 或 failed。只有当运营商报告过期时,Bird 才会产生 sms.expired。
省略该字段时,将使用 messaging_profile_id 中消息配置文件的有效期;如果两者都未设置,则使用运营商自身的规则。消息响应会报告实际生效的 validity_period。
我应该如何在应用程序中处理回执?
你应该将投递结果与请求接受以及收件人的任何操作分开跟踪。
将没有最终投递结果的消息视为待处理。在失败事件中读取错误码,以便排查原因。在日志中保留不熟悉的错误码,因为错误码集合是可扩展的。
使用已送达事件作为投递指标。对于验证码或确认流程,在收件人完成操作时记录成功。送达回执本身无法提供该度量。
SMS 事件记录了公开事件载荷和消息时间线。
简而言之
送达不等于已读。
回执报告网络的投递结果,但不能确认有人看到了该短信。
部分回执没有公开事件。
Bird 在内部记录缓冲回执,不会更改公开状态、时间线或 webhook 流。
失败原因决定失败事件类型。
可恢复的运营商原因产生 sms.undelivered;永久性或未映射的原因产生 sms.failed。
可恢复原因不会触发重新发送。
未送达的消息是终态,因此再次尝试需要单独发起一次新的发送。