你的发送请求可能在收件人手机收到任何内容之前就已成功。稍后的运营商报告会提供另一个结果,你的应用程序必须将其与请求接受分开处理。
送达回执告诉我什么?
回执从网络角度报告投递成功或投递问题。
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 | content_rejected | 永久性 |
可恢复的失败产生 sms.undelivered。该消息仍然是终态:Bird 不会自动重试。要将消息送达收件人,需要在底层问题消除后再次发送。
永久性失败产生 sms.failed。未映射的原因也会产生该事件,错误码为 unknown。该结果意味着 Bird 无法对运营商的原因进行分类,并不能独立证明目的地永久不可达。
我能设置运营商停止重试的时间吗?
你无法通过 Bird 的发送端点设置运营商的投递截止时间。
Bird 会以 HTTP 422 SMSUnsupportedFeature 拒绝任何提供的 validity_period。该字段用于控制运营商持续尝试投递短信的时长。
响应中不会返回对应的字段。Bird 在运营商报告过期时产生 sms.expired。你的应用程序无法从缺失的字段推断运营商的等待时长。
我应该如何在应用程序中处理回执?
你应该将投递结果与请求接受以及收件人的任何操作分开跟踪。
将没有最终投递结果的消息视为待处理。在失败事件中读取错误码,以便排查原因。在日志中保留不熟悉的错误码,因为错误码集合是可扩展的。
使用已送达事件作为投递指标。对于验证码或确认流程,在收件人完成操作时记录成功。送达回执本身无法提供该度量。
SMS 事件记录了公开事件载荷和消息时间线。
简而言之
送达不等于已读。
回执报告网络的投递结果,但不能确认有人看到了该短信。
部分回执没有公开事件。
Bird 在内部记录缓冲回执,不会更改公开状态、时间线或 webhook 流。
失败原因决定失败事件类型。
可恢复的运营商原因产生 sms.undelivered;永久性或未映射的原因产生 sms.failed。
可恢复原因不会触发重新发送。
未送达的消息是终态,因此再次尝试需要单独发起一次新的发送。