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

如何防止ejabberd客户端重连后接收离线消息?技术求助

解决ejabberd仅向在线用户发送消息的问题

我之前碰到过类似的情况——仅仅注释掉mod_offline模块有时候没法彻底解决离线消息推送的问题,可能是因为ejabberd的缓存或者其他默认模块在起作用。给你几个经过验证的解决方案:

1. 彻底禁用mod_offline模块

别只注释掉配置,要确保模块完全不被加载:

  • 打开你的ejabberd配置文件(通常是ejabberd.yml)
  • 找到modules段落,要么直接删除mod_offline这一项,要么明确设置它为禁用:
    modules:
      # 其他模块保持不变
      mod_offline: false
    
  • 修改后必须重启ejabberd服务,重载配置可能无法彻底清除已加载的模块缓存。

2. 添加消息过滤规则,拒绝离线消息

即使禁用了mod_offline,有时候ejabberd还是会尝试路由离线消息,这时候可以通过访问控制规则直接拦截:
在配置文件的access部分新增规则,然后让mod_message使用这个规则:

access:
  # 新增规则:拒绝向离线用户发送消息
  deny_offline:
    - deny:
        presence: offline

modules:
  mod_message:
    # 让消息发送遵循这个规则
    access_send: deny_offline

这样当接收者处于离线状态时,消息会被直接拒绝发送,发送方(客户端A)会收到发送失败的反馈,而客户端B上线后不会收到这条离线消息。

3. 检查并禁用消息归档模块(mod_mam)

如果你的ejabberd启用了mod_mam(消息归档),它可能会自动存储所有消息,当用户上线时同步这些归档内容。如果不需要这个功能,可以禁用它:

modules:
  mod_mam: false

或者配置它仅存储在线时的消息:

modules:
  mod_mam:
    default: never  # 默认不归档任何消息

测试步骤

  1. 重启ejabberd服务确保配置生效
  2. 保持客户端A在线,客户端B离线
  3. 客户端A发送消息“hello”给B
  4. 客户端B重新连接ejabberd
  5. 检查B是否收到消息——正常情况下应该不会收到,同时A会看到消息发送失败的提示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:34:11