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

Ubuntu 22.04下ejabberd的send_message API调用成功但消息未送达

解决ejabberd send_message API返回200但目标客户端收不到消息的问题

以下是针对问题的排查方向和解决方案:

  • 核对API请求参数的正确性
    确保to和from参数是完整的JID格式(如user@your-domain.com,若客户端指定了资源则需带上user@your-domain.com/ClientResource),ejabberd会静默丢弃格式不合法的消息请求。同时确认type参数设置为chat——PSI客户端默认监听该类型的消息,若设置为normal或其他类型,客户端可能不会展示消息。
    正确的请求体示例:

    {
      "to": "target_user@example.com/PSI",
      "from": "admin@example.com",
      "body": "API test message",
      "type": "chat"
    }
    
  • 验证权限配置
    检查ejabberd.yml中的权限规则,确保调用API的用户拥有发送消息的权限:

    1. 在acl中确认调用用户的身份配置正确,比如管理员用户的条目:
      acl:
        admin:
          user: ["admin@example.com"]
      
    2. 在access_rules中确保local_send或c2s规则允许该用户发送消息:
      access_rules:
        local_send:
          allow: admin
          allow: local
      
  • 检查mod_http_api的权限授予
    确认mod_http_api的api_permissions中,调用用户被明确授予send_message权限:

    api_permissions:
      "admin access":
        who:
          - access:
              - allow:
                  - acl: admin
        what:
          - "send_message"
          # 其他已授权的API接口
    
  • 排查隐私与roster模块影响
    如果目标用户的隐私列表(mod_privacy)阻止了发送方,消息会被静默丢弃。可以临时禁用mod_privacy测试,或登录目标客户端检查隐私设置。另外,mod_roster若未正确配置,也可能影响消息路由,确保该模块已启用且正常运行。

  • 调整日志级别定位问题
    当前日志无记录是因为默认日志级别不够,修改ejabberd.yml的loglevel为debug:

    loglevel: debug
    

    重启ejabberd后重新调用API,查看/var/log/ejabberd/ejabberd.log,日志会输出消息处理的详细流程,帮助定位消息被丢弃的具体原因。

  • 确认离线消息模块配置
    若目标客户端不在线,需启用mod_offline存储离线消息,否则消息会直接被丢弃。检查modules段是否包含:

    modules:
      mod_offline: {}
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:10:36