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

EjabberD MAM归档消息丢失求助:重新登录后归档消息被删除

解决Ejabberd MAM归档消息退出登录后丢失的问题

看起来你遇到的核心问题是Ejabberd的MAM归档在用户退出后被自动清理了,结合你的配置(LDAP+匿名认证)和当前的MAM设置,我整理了几个关键的遗漏配置点和排查方向:

1. 给mod_mam加上持久化存储的明确配置

你已经开了default: always让消息归档,但默认情况下mod_mam可能只是把消息存在内存里,尤其是匿名用户的会话。得在ejabberd.yml里给mod_mam补全存储相关的参数:

mod_mam:
  default: always
  store_messages: true  # 明确开启消息落地存储
  persistent: true      # 强制把归档写入磁盘的Mnesia库
  assume_mam_usage: true  # 让所有会话都走MAM归档,避免漏存

2. 给匿名用户配置归档保留策略

你的认证包含匿名方式,而Ejabberd默认会在匿名用户断开后删掉他们的所有数据——包括MAM归档。得在host_config里给匿名用户加个“免删”配置:

host_config:
  "x.x.x.x":
    auth_method:
      - anonymous
      - ldap
    allow_multiple_connections: false
    # 新增这两行,保留匿名用户的归档数据
    anonymous_protocol: login
    anonymous_user_expire: 0  # 设为0表示永不删除匿名用户的账户和归档
    # 同时给这个主机单独指定MAM配置,确保生效
    mod_mam:
      default: always
      store_messages: true
      persistent: true

3. 检查有没有自动清理归档的配置

看看你的ejabberd.yml里有没有开mod_purge这类自动清理模块,另外检查mod_mam里有没有设置expire_after参数——这个参数会定时删掉旧归档,如果有的话要么移除,要么设为0(表示永不清理):

mod_mam:
  # 确保没有下面这种自动清理的配置,如果有就删掉或者改成expire_after: 0
  # expire_after: 86400

4. 验证LDAP用户的归档存储权限

对于LDAP登录的用户,要确保Ejabberd为他们创建了持久化的用户条目,并且mod_mam有权限写入归档。你可以通过Mnesia的转储文件检查archive表有没有对应用户的记录,或者查看ejabberd的日志,看看有没有存储失败的报错信息。

小建议:优化客户端登出逻辑

你的Strophe登出代码本身没问题,但可以在登出前先发送一个离线状态包,让Ejabberd更稳妥地处理会话结束:

// 先发送离线状态
connection.send($pres({type: "unavailable"}));
// 延迟一下再断开,确保状态包发送完成
setTimeout(() => {
  connection.disconnect();
  connection.reset();
}, 500);

调整完这些配置后,重启Ejabberd测试一下,应该就能实现消息的永久归档,重新登录后也能检索到历史消息了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:36:11