如何获取已发送消息的 MAM 消息 ID?

Posted

技术标签:

【中文标题】如何获取已发送消息的 MAM 消息 ID?【英文标题】:How to get MAM message ID of sent messages? 【发布时间】:2018-03-13 15:33:16 【问题描述】:

我正在使用带有客户端库 Strophe.js 的 eJabberd 服务器(启用 MAM)。客户端应用在本地存储中存储固定数量的消息。

我从服务器接收到的所有消息都包括元素 <archived/><stanza-id/>,它们提供服务器端生成的 ID:

<message 
    xmlns="jabber:client" to="aaa@example.net/8667085700924567016834" from="aaa@example.net">
    <result 
        xmlns="urn:xmpp:mam:2" id="1520510373346685">
        <forwarded 
            xmlns="urn:xmpp:forward:0">
            <message 
                xmlns="jabber:client" xml:lang="en" to="bbb@example.net" from="aaa@example.net/60965696931000870402419" type="chat">
                <archived 
                    xmlns="urn:xmpp:mam:tmp" by="aaa@example.net" id="1520510373346685"/>
                <stanza-id 
                    xmlns="urn:xmpp:sid:0" by="aaa@example.net" id="1520510373346685"/>
                <body>asdf</body>
            </message>
            <delay 
                xmlns="urn:xmpp:delay" from="example.net" stamp="2018-03-08T11:59:33.346685Z"/>
        </forwarded>
    </result>
</message>

我使用这些 ID 在每个 MAM 调用中获取固定数量的消息(使用 RSM 分页 - before/after/max 属性)。例如:

params = 
    "before": "1520510373346685",
    "max": 10,
    onMessage: <some handler>,
    onComplete: <some handler>,

this.connection.mam.query(Strophe.getBareJidFromJid(this.myJid), params);

这让我在 stanza-id 1520510373346685 的消息之前获得 10 条消息。

但是,我发送的消息本身没有此 ID,直到我发送它们并从 MAM 检索。

我没有找到任何从服务器获取当前发送的消息ID的示例,并且Strophe在消息从客户端发送并被服务器接收后没有提供任何回调。

那么,问题是 - 有没有办法为当前发送的消息获取服务器生成的消息 ID(stanza-id/archived)?

也许我自己的方法是错误的 - 我应该生成自己的 ID 并将其添加到来自客户端的每条消息中吗?

【问题讨论】:

【参考方案1】:

除了查询存档之外,目前没有指定任何机制。 XMPP 社区未来解决此问题的一个重要想法是将发送碳反映给原始发件人,其中将包括一个带有存档分配 ID 的 stanza-id 元素。

【讨论】:

谢谢你,@Flow。作为对此的解决方案,我可以在每条消息上使用我自己的 ID 作为属性(在内部消息节中)吗?还是不推荐? 解决方案如何?您想知道分配给存档的 ID,但您不知道先验(当前规范)。 对不起,它肯定不是 :D 但它解决了避免缓存和存档之间重复消息的问题(我没有提到),直到我再次查询存档。你知道发送碳反射是否会很快实施吗?还是目前只是 XMPP 标准中的一个 TODO? 这是一个持续的讨论,尚未(明确)指定。请感到鼓励接近 XMPP 社区并参与其中。 :) 一个很好的起点是 xmpp.org 和 xsf @muc.xmpp.org MUC。 嗨,你能通过获取发送消息@Flow的节ID来解决这个问题

以上是关于如何获取已发送消息的 MAM 消息 ID?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 获取已收到发送消息的用户(UPDATE)

如何获取从 Bot Framework Composer 发送的消息的 ResourceResponse.Id

如何获取某个用户发送的最后 1000 条消息?

ejabberd - 通过API获取mod_mam的历史消息。

如何获取最近发送消息的人排序的用户列表以显示在收件箱中

是否可以捕获使用 SmtpClient 发送的电子邮件的“消息 ID”?