You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何ejabberd的send_message API始终返回0?离线时如何获取未送达响应

问题原因

ejabberd的send_message API返回0(成功)的判定逻辑是服务器成功接收并完成消息的处理流程,而非消息即时送达目标客户端:

  • 当目标用户在线时,服务器直接推送消息,完成处理后返回成功;
  • 当目标用户离线时,若开启了mod_offline模块(默认开启),服务器会将消息存入离线存储队列,等待用户上线后推送,此时服务器认为自己已经完成了消息的托管任务,因此同样返回成功状态,不会区分用户是否在线。
解决方法

要让API返回用户离线导致消息无法即时送达的响应,可以通过以下几种方式实现:

1. 先检查用户在线状态再发送消息

调用ejabberd自带的check_user_online API,先验证目标用户的在线状态:

  • 如果用户在线,再调用send_message API发送消息;
  • 如果用户离线,直接返回自定义的错误状态(比如返回1或提示“用户离线”),无需执行发送操作。

示例流程(伪代码):

# 先调用check_user_online接口验证状态
response = call_api("check_user_online", {"user": "target_user@your_domain"})
if response["status"] == "offline":
    return {"code": 1, "message": "用户离线,消息未即时送达"}
else:
    send_response = call_api("send_message", {"to": "target_user@your_domain", "body": "消息内容"})
    return send_response

2. 禁用离线消息存储,强制返回错误

修改ejabberd配置文件(ejabberd.yml),调整mod_offline模块的存储设置:

modules:
  mod_offline:
    store_offline: false  # 设置为false,关闭离线消息存储功能

此时当目标用户离线时,服务器既无法推送消息也不能存储消息,send_message API会返回非0的错误码,以此标识消息未送达。

注意:这种方式会导致离线用户完全收不到消息,需根据业务场景评估是否适用。

3. 自定义扩展ejabberd API逻辑

如果需要更灵活的响应逻辑,可以自定义ejabberd模块,扩展send_message的处理流程:

  • 在模块中添加用户在线状态检查逻辑;
  • 当检测到用户离线时,直接返回自定义的错误响应(比如错误码2,描述“用户离线,消息已暂存”);
  • 若用户在线,则正常处理消息并返回成功。

4. 利用消息回执异步确认

如果不需要API直接返回状态,可以在发送消息时添加XMPP消息回执请求(通过send_message API的extra_headers参数添加urn:xmpp:receipts相关标识),后续监听目标客户端返回的回执消息,以此确认消息是否真正被用户接收。这种方式是异步的,适合不需要即时同步返回结果的场景。

内容的提问来源于stack exchange,提问作者chitharthan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:33:11