SMS

什么是送达回执 (DLR)?它的可靠性如何?

送达回执 (DLR) 报告短信的网络投递结果,但无法证明任何人已阅读该消息。

你的发送请求可能在收件人手机收到任何内容之前就已成功。稍后的运营商报告会提供另一个结果,你的应用程序必须将其与请求接受分开处理。

送达回执告诉我什么?

回执从网络角度报告投递成功或投递问题。

SMS 投递结果可能在手机放在抽屉里无人查看时到达。它不能证明收件人看到了发送者身份,也不能证明他们阅读了完整的短信内容。

网络独立于发送请求的响应来发送回执,也可能抑制某些报告。SMPP 回执参考记录了运营商连接的这些控制项。

Bird 公开哪些运营商回执?

你会收到已识别投递结果的公开事件。缓冲回执保留在内部。

缓冲回执表示运营商正在暂存该消息。Bird 将其记录在内部事件日志中,不会更改公开消息状态。你在公开时间线或 webhook 中看不到任何更新。

运营商回执状态Bird 事件
deliveredsms.delivered
expiredsms.expired
rejectedsms.rejected
delivery_failed,可恢复原因sms.undelivered
delivery_failed,永久性或未映射原因sms.failed
buffered无公开事件

未识别的运营商状态不会产生事件。因此,缺少公开更新并不能证明运营商没有发送回执。

为什么同一个失败状态会产生不同的事件?

Bird 根据运营商的失败原因判断底层问题是否可能消除。

运营商原因Bird 错误码分类
unavailable_subscriberunreachable可恢复
received_network_errorprovider_unavailable可恢复
capacity_limit_reachedprovider_unavailable可恢复
unknown_subscriberinvalid_destination永久性
opted_outrecipient_opted_out永久性
carrier_rejectedcontent_rejected永久性

可恢复的失败产生 sms.undelivered。该消息仍然是终态:Bird 不会自动重试。要将消息送达收件人,需要在底层问题消除后再次发送。

永久性失败产生 sms.failed。未映射的原因也会产生该事件,错误码为 unknown。该结果意味着 Bird 无法对运营商的原因进行分类,并不能独立证明目的地永久不可达。

我能设置运营商停止重试的时间吗?

你无法通过 Bird 的发送端点设置运营商的投递截止时间。

Bird 会以 HTTP 422 SMSUnsupportedFeature 拒绝任何提供的 validity_period。该字段用于控制运营商持续尝试投递短信的时长。

响应中不会返回对应的字段。Bird 在运营商报告过期时产生 sms.expired。你的应用程序无法从缺失的字段推断运营商的等待时长。

我应该如何在应用程序中处理回执?

你应该将投递结果与请求接受以及收件人的任何操作分开跟踪。

将没有最终投递结果的消息视为待处理。在失败事件中读取错误码,以便排查原因。在日志中保留不熟悉的错误码,因为错误码集合是可扩展的。

使用已送达事件作为投递指标。对于验证码或确认流程,在收件人完成操作时记录成功。送达回执本身无法提供该度量。

SMS 事件记录了公开事件载荷和消息时间线。

简而言之

  1. 送达不等于已读。

    回执报告网络的投递结果,但不能确认有人看到了该短信。

  2. 部分回执没有公开事件。

    Bird 在内部记录缓冲回执,不会更改公开状态、时间线或 webhook 流。

  3. 失败原因决定失败事件类型。

    可恢复的运营商原因产生 sms.undelivered;永久性或未映射的原因产生 sms.failed。

  4. 可恢复原因不会触发重新发送。

    未送达的消息是终态,因此再次尝试需要单独发起一次新的发送。

付诸实践。

继续查阅此主题的文档、指南和示例。资源为英文。

获取实施简报

基于同一网络构建。

测试 API 密钥即刻获取。添加付款方式并验证发送者身份后,即可解锁生产环境。

你的下一个创意。
随时连接。