技术问询:Conversations无法接收ejabberd离线消息,Gajim却可正常接收
结合你描述的环境(Debian系统上的ejabberd 18.01,客户端Conversations 1.23.8、Gajim)和现象,这个问题的核心是两款客户端处理离线消息的机制差异,加上ejabberd的配置可能没有适配Conversations的需求。下面是具体的分析和排查步骤:
背景确认
- 离线状态验证:Bob离线已通过
ejabberdctl connected_users确认,消息成功存入离线存储(ejabberdctl get_offline_count bob example.com验证有效) - 异常现象:Bob上线后,Gajim可正常接收离线消息,但Conversations完全无法获取
核心原因分析
两款客户端的离线消息获取逻辑存在明显差异:
- Gajim默认使用传统的XEP-0160离线消息拉取方式,直接请求服务器的离线消息存储
- Conversations则更依赖**XEP-0313(消息归档管理MAM)**来获取历史/离线消息,同时也可能依赖XEP-0357推送通知,如果ejabberd的配置没跟上,就会出现收不到的情况
逐步排查与解决
检查ejabberd的mod_offline完整配置
你的ejabberd.yml里已经设置了离线消息配额,但还要确保关键配置项正确:
打开/etc/ejabberd/ejabberd.yml,找到mod_offline模块,确认:modules: mod_offline: access_max_user_messages: max_user_offline_messages store_body: true # 必须设置为true,否则消息内容不会被存储,Conversations无法解析如果
store_body是false,即使消息被存储,Conversations也看不到内容,自然不会显示。确认mod_mam(消息归档)的配置
Conversations默认用MAM来拉取离线消息,ejabberd 18.01需要正确配置mod_mam才能支持:
检查ejabberd.yml中的mod_mam部分,确保:modules: mod_mam: default: always # 自动为所有用户启用MAM store_messages: true # 存储所有消息(包括离线消息) max_age: 365 # 可选,设置消息保留天数如果
mod_mam没有配置,或者default设为never,Conversations就无法通过MAM获取到离线消息,而Gajim用传统方式不受影响。检查Conversations的客户端设置
有时候是客户端自身的设置导致的:- 打开Conversations,进入
设置->消息获取 - 确保
获取离线消息选项是开启状态 - 如果开启了
仅通过推送接收消息,要么关闭这个选项(让客户端主动拉取),要么在ejabberd上配置XEP-0357推送服务(这个配置相对复杂,优先建议关闭推送-only模式)
- 打开Conversations,进入
查看ejabberd日志找错误线索
如果上面的配置都没问题,查看ejabberd的日志(默认路径/var/log/ejabberd/ejabberd.log),搜索Bob上线时的相关日志:
用命令过滤关键内容:grep "bob\|offline\|mam" /var/log/ejabberd/ejabberd.log看看有没有类似"拒绝MAM查询"、"离线消息推送失败"的错误,这些日志能帮你定位具体的配置或权限问题。
版本兼容性调整(可选)
ejabberd 18.01是2018年的老版本,而Conversations 1.23.8是较新的客户端,可能存在协议实现的兼容性问题:- 可以尝试用更旧版本的Conversations(比如1.20.x系列)测试,看是否能正常接收
- 或者考虑升级ejabberd到较新的稳定版(比如23.x或更高),新版本对现代XMPP协议的支持更完善,能更好适配Conversations的需求
总结
最常见的解决场景是:ejabberd没有配置mod_mam或者配置不正确,导致Conversations无法通过MAM获取离线消息,而Gajim用传统方式正常。按照上面的步骤排查,应该能快速解决问题。
内容的提问来源于stack exchange,提问作者kiigass

