Ejabberd将邮件返回到发件人挂钩/邮件回执 [英] Ejabberd return message to sender hook / message receipts

查看:70
本文介绍了Ejabberd将邮件返回到发件人挂钩/邮件回执的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要客户端验证邮件是否已到达Ejabberd服务器。对我来说,最简单的方法似乎是使用钩子将消息返回给用户,然后进行编码,以便我的客户端进行验证。

I need client side verification that message reached Ejabberd server. Easiest way to me seems to have a hook return the message back to the user and then code so my client verifies.

我发现已验证的mod_stanza_ack已由所有传入消息触发。

I found mod_stanza_ack with I've verified is triggered by all incoming messages.

所以问题是:

如何从内部将消息发送回用户

我需要快速解决方案。

I need a quick solution.

-module(mod_stanza_ack).
-behaviour(gen_mod).

-include("ejabberd.hrl").

-export([start/2,
         stop/1]).

-export([on_user_send_packet/3]).


start(Host, _Opts) ->
    ?INFO_MSG("mod_stanza_ack starting", []),
    ejabberd_hooks:add(user_send_packet, Host, ?MODULE, on_user_send_packet, 0),
    ok.

stop(Host) ->
    ?INFO_MSG("mod_stanza_ack stopping", []),
    ejabberd_hooks:delete(user_send_packet, Host, ?MODULE, on_user_send_packet, 0),
    ok.

on_user_send_packet(From, To, Packet) ->
    ?INFO_MSG("mod_stanza_ack a package has been sent coming from: ~p", [From]),
    ?INFO_MSG("mod_stanza_ack a package has been sent to: ~p", [To]),
    ?INFO_MSG("mod_stanza_ack a package has been sent with the following packet: ~p",     [Packet]),
    Packet.


推荐答案

好的,所以我知道了。这是一个非常简单的return all hook:

OK, So I figured this out. Here is a very simple return all hook:

%% name of module must match file name
-module(mod_echo_msg).

%% Every ejabberd module implements the gen_mod behavior
%% The gen_mod behavior requires two functions: start/2 and stop/1
-behaviour(gen_mod).

%% public methods for this module
-export([start/2, stop/1]).
-export([on_user_send_packet/3]).

%% included for writing to ejabberd log file
-include("ejabberd.hrl").

%% ejabberd functions for JID manipulation called jlib.
-include("jlib.hrl").

%%add and remove hook module on startup and close

start(Host, _Opts) ->
    ?INFO_MSG("mod_echo_msg starting", []),
    ejabberd_hooks:add(user_send_packet, Host, ?MODULE, on_user_send_packet, 0),
    ok.

stop(Host) ->
    ?INFO_MSG("mod_echo_msg stopping", []),
    ejabberd_hooks:delete(user_send_packet, Host, ?MODULE, on_user_send_packet, 0),
    ok.

on_user_send_packet(From, To, Packet) ->
        return_message_reciept_to_sender(From, To, Packet),
        Packet.


return_message_reciept_to_sender(From, _To, Packet) ->
    IDS = xml:get_tag_attr_s("id", Packet),
    FeedIDS = xml:get_tag_attr_s("feedid", Packet),
    ReturnRecieptType = "serverreceipt",
%%    ?INFO_MSG("mod_echo_msg - FeedID: ~p MsgID: ~p To: ~p From: ~p", [FeedIDS, IDS, _To, From]),
    send_message(From, From, ReturnRecieptType, FeedIDS, IDS, "").



send_message(From, To, TypeStr, FeedIDS, IDS, BodyStr) ->
    XmlBody = {xmlelement, "message",
           [{"type", TypeStr},
        {"from", jlib:jid_to_string(From)},
        {"to", jlib:jid_to_string(To)},
        {"id", IDS},
        {"feedid", FeedIDS}],
           [{xmlelement, "body", [],
         [{xmlcdata, BodyStr}]}]},
    ejabberd_router:route(From, To, XmlBody).

如果您想限制返回的消息类型,请将此功能更改为以下形式:

if you want to limit what types of messages are returned change this function to something like this:

on_user_send_packet(From, To, Packet) ->
    TypeS = xml:get_tag_attr_s("type", Packet),
    if TypeS == "sometype0"; TypeS == "sometype1"; TypeS == "sometype2" ->
        return_message_reciept_to_sender(From, To, Packet);
        true-> none
    end,
    Packet.

这篇关于Ejabberd将邮件返回到发件人挂钩/邮件回执的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆