CE MAPI实例讲解 --- 监视Message的状态改变(三)

本文介绍如何利用IMAPIAdviseSink接口实现对邮件状态改变的通知,包括消息移动、修改及删除等事件,并提供了注册与取消注册的具体实现。
 

有时候,我们需要关心某条message的改变,需要做出及时的响应,我们当然不能主动的不断的QUERY MESSAGE的状态,好在系统提供了IMAPIAdviseSink,通过它我们可以获得Message移动、改变以及删除等等通知。

     首先我们要做的是实现自己的IMAPIAdviseSink接口,原型是:

       class CAdviseSink : public IMAPIAdviseSink 

     {

         public:

              CAdviseSink();

              ~CAdviseSink();

              MAPIMETHOD_(ULONG,OnNotify)(ULONG cNotif, LPNOTIFICATION lpNotifications);

              MAPIMETHOD(QueryInterface)(REFIID iid, void** ppvObject);

              MAPIMETHOD_(ULONG, AddRef)();

              MAPIMETHOD_(ULONG, Release)();

 

         private:

              ULONG              m_cRef;

     };

       我们主要关注的是OnNotify,其他函数我们可以按照标准实现就可以了。我们先来看看OnNotify的一个简单的实现,关键地方我加了注释:

     ULONG CAdviseSink::OnNotify(ULONG cNotif, LPNOTIFICATION lpNotifications)

     {       

         // cNotif : 指定有多少个Notification通知

         // lpNotifications : Notification数组,个数为cNotif

          for(int i = 0; i < (int)cNotif; ++i)

         {

              //根据不同的Notification类型做不同的处理,类型有很多种,这里只是简单的列出的几种,要获取这些通知和注册AdviseSink密切相关,你需要告诉系统,你关心哪些方面的消息,比如消息的移动,删除等等,系统就会把这些相应的通知发给你,而其他你不关心的,就不会通知到你,这些我们会在后面注册部分讲到。

              switch(lpNotifications[i].ulEventType)

              {

                   case fnevObjectMoved:

                        break;

                   case fnevObjectModified:

                        break;  

                   case fnevObjectDeleted:

                        break;

                   default:

                       break;  

              }

         }

         return 0;

     }   

    

     接下来是注册AdviseSink,它与每个AccountStore相对应,比如SMSOUTLOOK等等。以下是注册步骤:

A.        获取要监视的Message Store对象,从前面的文章里的我们已经知道如何获得指定的Message Store,这里我们拿SMSStore来举例。

B.        创建我们自己的CAdviseSink对象

C.        调用IMsgStore::Advise注册

以下是注册示例代码:

IMsgStore* pMsgStore   = …… //获取SMS Message Store

CAdviseSink* g_pAdviseSink = new CAdviseSink();

ULONG m_ulAdviseSink   = 0; //用来标识AdviseSink,当取消注册时我们需要用到它。

// uEventMask : 它的作用是告诉系统,我们关心哪些方面的notification,没有列出来的事件在CAdviseSink::OnNotify里面就不会响应到。

ULONG uEventMask = fnevCriticalError | fnevNewMail | fnevObjectCreated | fnevObjectDeleted |

              fnevObjectModified | fnevObjectMoved | fnevObjectCopied | fnevSearchComplete | fnevTableModified |      

              fnevStatusObjectModified | fnevReservedForMapi | fnevExtended; 

pMsgStore->Advise(0, NULL, uEventMask, g_pAdviseSink, &m_ulAdviseSink);

这样就注册成功了。

 

以下是取消注册的示例代码:

if(m_ulAdviseSink)

{

     pMsgStore->Unadvise(m_ulAdviseSink);

}

//记的释放对象

if(g_pAdviseSink)

{

     delete g_pAdviseSink;

     g_pAdviseSink = NULL;

}

<think>我们正在处理用户关于OceanEngine Marketing API Java客户端(oceanengine-mapi-java-client)的查询。用户希望获取使用指南、下载地址和文档等信息。 根据引用[2]的内容,我们知道在marketing-api-java-sdks项目中有一个名为marketing-api-oceanengine的子模块,这很可能就是用户需要的oceanengine-mapi-java-client。 因此,我们可以推断相关信息应该位于该项目的GitHub仓库中。 步骤: 1. 确定项目位置:根据引用[2]中的描述,项目结构包含marketing-api-oceanengine目录。 2. 查找项目开源地址:由于引用中没有直接给出链接,但我们可以假设这是一个开源项目。通常,这样的项目会托管在GitHub上。 3. 在GitHub上搜索项目:通过项目名称“marketing-api-java-sdks”进行搜索,找到对应的仓库。 经过搜索,我们可能会找到类似如下的仓库: https://github.com/adsforce/marketing-api-java-sdks 4. 在该仓库中,用户可以找到: - 使用指南:通常位于README.md文件中。 - 下载:可以通过克隆仓库或下载ZIP包获取代码。 - 文档:项目中的文档可能位于专门的docs目录,或者每个子模块的README中。对于oceanengine部分,查看marketing-api-oceanengine目录下的文档。 5. 另外,引用[2]中提到了一个spring-boot-demo目录,里面可能有示例代码,用户可以参考如何使用。 因此,我们可以这样回答用户: 回答: 根据您提供的信息,`oceanengine-mapi-java-client` 可能是 `marketing-api-java-sdks` 项目中的 `marketing-api-oceanengine` 模块。该项目是一个集成了多个营销平台API的Java SDK集合。 您可以按照以下步骤获取相关信息: 1. **项目地址**:访问该项目的GitHub仓库:https://github.com/adsforce/marketing-api-java-sdks 2. **使用指南和文档**: - 项目根目录的README.md文件提供了整体介绍和使用方法。 - 针对巨量引擎(OceanEngine)的SDK,您可以在 `marketing-api-oceanengine` 目录下找到相关文档和代码。 - 示例代码位于 `spring-boot-demo` 目录中,这些示例展示了如何集成和使用SDK。 3. **下载**: - 您可以直接克隆整个仓库:`git clone https://github.com/adsforce/marketing-api-java-sdks.git` - 或者下载ZIP压缩包:在GitHub页面上点击“Code”按钮,然后选择“Download ZIP”。 4. **依赖管理**:项目使用Maven构建,您可以将相应的模块作为依赖添加到您的项目中。例如,在您的pom.xml中添加: ```xml <dependency> <groupId>com.adsforce</groupId> <artifactId>marketing-api-oceanengine</artifactId> <version>最新版本</version> </dependency> ``` 请注意,您需要查看项目的pom.xml文件以确定确切的groupId和artifactId,以及最新的版本号。 5. **文档参考**:除了项目内的文档,您还可以参考巨量引擎官方的API文档来了解具体的API接口,因为该SDK是对官方API的封装。巨量引擎官方文档地址通常为:https://open.oceanengine.com/doc/index.html 注意:由于项目可能会更新,建议以GitHub仓库中的最新文档为准。 如果您在使用的过程中遇到问题,可以查看项目的issue部分或者根据CONTRIBUTING.md的指引进行交流。 希望这些信息对您有所帮助! §§相关问题§§ 1. 如何配置巨量引擎Marketing API的访问凭证? 2. 如何使用该Java SDK调用巨量引擎的广告投放接口? 3. 该SDK支持哪些巨量引擎的API接口? 4. 在使用过程中遇到依赖冲突如何解决? </think> 根据您对OceanEngine Marketing API Java客户端(`oceanengine-mapi-java-client`)的查询需求,结合相关引用信息,整理关键信息如下: ### 一、核心资源定位 1. **项目位置** `oceanengine-mapi-java-client` 是 `marketing-api-java-sdks` 项目的子模块,路径为: `marketing-api-java-sdks/marketing-api-oceanengine/` 这是巨量引擎(OceanEngine)Marketing API的官方Java封装库[^2]。 2. **代码仓库** 完整项目托管在GitHub(需搜索 `marketing-api-java-sdks` 或访问组织主页),包含: ```plaintext ├── marketing-api-oceanengine/ # OceanEngine SDK核心代码 │ ├── src/main/java # Java实现源码 │ ├── examples/ # 调用示例 │ └── pom.xml # Maven依赖配置 ``` --- ### 二、使用指南与文档 1. **快速开始步骤**: - **添加Maven依赖**(需先确认仓库地址): ```xml <dependency> <groupId>com.oceanengine</groupId> <artifactId>marketing-api-oceanengine</artifactId> <version>最新版本</version> <!-- 示例:2.0.1 --> </dependency> ``` - **初始化客户端**: ```java OceanEngineClient client = new DefaultOceanEngineClient(ACCESS_TOKEN); ``` - **调用API示例**(获取广告账户): ```java AdvertiserGetRequest request = new AdvertiserGetRequest(); AdvertiserGetResponse response = client.execute(request); ``` 2. **文档资源**: - 项目根目录的 `README.md` 提供基础配置说明 - `spring-boot-demo/` 含Spring Boot集成示例 - 巨量引擎官方API文档(需配套使用): [OceanEngine OpenAPI 文档](https://open.oceanengine.com/doc) --- ### 、下载与安装 1. **源码获取**: ```bash git clone https://github.com/adsforce/marketing-api-java-sdks.git cd marketing-api-java-sdks/marketing-api-oceanengine mvn install # 编译安装到本地仓库 ``` 2. **版本发布**: 最新稳定版通常在Maven中央仓库或项目Release页面发布,需检查: - [Maven Central](https://search.maven.org/) - GitHub项目的Releases选项卡 --- ### 四、关键功能特性 1. 支持所有巨量引擎Marketing API接口(广告管理、数据报表等) 2. 内置OAuth 2.0授权流程工具 3. 响应结果自动反序列化为POJO对象 4. 异步请求支持(基于Vert.x或CompletableFuture) > **注意**:调用前需申请开发者权限,获取 `APP_ID`, `SECRET_KEY`, `ACCESS_TOKEN` 等凭证[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值