Ubuntu 22.04下ejabberd的send_message API调用成功但消息未送达
以下是针对问题的排查方向和解决方案:
核对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的用户拥有发送消息的权限:- 在
acl中确认调用用户的身份配置正确,比如管理员用户的条目:acl: admin: user: ["admin@example.com"] - 在
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

