社区
消息协作
帖子详情
iNotes(R5里面的)是怎样标识邮件是否已阅读的?
flyingpipo
2004-08-04 09:31:25
各位,我现在需要用iNotes里面取一个数据,即未读邮件的数量,iNotes(R5里面的)是怎样标识邮件是否已阅读的?急切希望得到各位的答复!
...全文
331
7
打赏
收藏
iNotes(R5里面的)是怎样标识邮件是否已阅读的?
各位,我现在需要用iNotes里面取一个数据,即未读邮件的数量,iNotes(R5里面的)是怎样标识邮件是否已阅读的?急切希望得到各位的答复!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
gjd111686
2004-08-27
打赏
举报
回复
Lotus Domino/Notes是美国莲花公司出的企业通讯和群件服务平台。但由于其本身提供的开发工具的限制,在Notes中实现系统级功能十分困难。比如在Notes中,不能通过公式或脚本来得到一个数据库的未读文档的数量和其内容。但这个未读文档数的小功能在做有些方面是十分有用的,例如我们可以根据这个未读文档数来做个提醒功能,提醒用户该进行某类工作如文件签发等。Notes系统本身有个Minder的程序,它是在有新邮件来到的时候,提醒用户,并可提供一些基本的信息:来信人,标题等。我们也可以这样做(当然利用未读文档数来做不是完美,如果你有兴趣,你可以试试做个数据库钩子程序来实现,但总的来说,利用未读文档数来做较为简单。)。
本文就是讨论如何利用Notes提供的C API来实现读取一个Notes数据库的未读文档数和其信息。因为利用的是C API,所以我们的开发语言是C。开发工具我们选用的是VC++ 6.0。我们需要借助的是Notes本身提供的C API函数。Notes的大部分API都封装在nNotes.dll文件中。其中包括有ACL,Database,User,Document,Item等各个方面的API函数。它不光能实现几乎所有在Notes中实现的功能,它还提供了其他在Notes中难以想象的功能(换句话说,你可以自己写自己特有的Notes桌面程序而不再使用Notes.exe。当然它的功能还远不止这点)。利用Notes API包,我们可以做以下的程序:
1、独立应用程序。
2、DOMINO 服务器的扩展插入服务(add-in tasks)。
3、NOTES 客户机的菜单扩展插入(menu add-ins)。
4、NOTES 客户机可动态加载的函数库。
5、数据库的钩子驱动程序(HOOK Drivers)。
6、扩展管理程序的钩子函数库。
7、非NOTES数据库的驱动程序。
下面简单介绍一下我们后面会涉及的主要的Notes API函数:
NotesInitExtended:初始化Notes环境,应在所有Notes API函数调用前初始化系统。
NSFDbOpen:打开指定的Notes数据库。
NSFDbClose:关闭指定的Notes数据库。
NSFDbGetUnreadNoteTable:取得指定数据库内的未读文档列表。
NSFDbUpdateUnread:更新数据库的未读文档列表。
NIFFindView:取得数据库内的指定视图或文件夹。
NIFOpenCollection:取得指定视图或文件夹的所有文档。
NIFUpdateCollection:更新指定视图或文件夹的所有文档。
NIFCloseCollection:关闭文档集。
NIFReadEntries:读取文档集的指定文档。
NSFNoteOpen:打开指定文档。
NSFItemGetText:取得文档的指定字段值。
程序流程:
数据库中有张类型为IDTable的未读文档列表,其中包含了该数据库的带有未读标志的文档号。这张表存储在数据库中和客户机的Desktop.dsk文件中。当然,在数据库和文件中的这张表是一样的。当他们不一致时,则在你打开数据库时,它们会自动同步,使他们保持一样。
我们就是要取得这张未读文档表,再统计一下这张表中有多少项,就知道了数据库中多少文档带有未读标志。我们还可以在此基础上取得该文档的一些具体信息。但这张表是整个数据库的未读文档列表,我们怎么得到某个视图或文件夹的未读文档数和信息呢?实际上,这才是我们真正关心的。我们可以再找到某个视图和文件夹的文档列表,再与上面的未读文档列表进行一一比较,相同的则是该视图或文件夹的未读文档列表。
主要程序如下:
//////////////////////////////////////////////////////
// InitNotes:初始化Notes环境,打开数据库
// szServerName:服务器名
// szDBName:数据库名
// szDirectory:Notes系统目录
// 返回值:1 - 成功
// 0 - 失败
int CNotes::InitNotes(char *szServerName,char *szDBName,char *szDirectory)
{
STATUS status;
char szPathName[MAX_PATH];
char szpInitPara[1][260];
// 数据库路径名=服务器名+“!!”+数据库名
if (strlen(szServerName)==0)
strcpy(szPathName,szDBName);
else {
strcpy(szPathName,szServerName);
strcat(szPathName,"!!");
strcat(szPathName,szDBName);
}
strcpy(szpInitPara[0],szDirectory);
if (!m_bOpened)
NotesInitExtended(1,(char**)szpInitPara); // 初始化Notes环境
status=NSFDbOpen(szPathName,&hDb); // 打开数据库
if (status!=NOERROR) {
m_bOpened=false;
return 0;
}
m_bOpened=true;
return 1;
}
///////////////////////////////////////////////////
// GetUnread:取得指定视图或文件夹中的未读文档数
// szViewName:视图或文件夹名
// 返回值:-1 - 失败
// 其他 - 未读文档数
int CNotes::GetUnread(char *szViewName)
{
STATUS status;
char szUserName[MAX_PATH];
status=SECKFMGetUserName(szUserName); // 得到当前用户名
if (status!=NOERROR) {
m_bGetUnread=false;
return -1;
}
status=NSFDbGetUnreadNoteTable(hDb,szUserName,_
strlen(szUserName),true,&hTable);
// 取得数据库的未读文档列表
if (status!=NOERROR) {
m_bGetUnread=false;
return -1;
}
if (hTable==NULL) {
m_bGetUnread=false;
return -1;
}
status=NSFDbUpdateUnread(hDb,hTable); // 更新未读文档列表
if (status!=NOERROR) {
OSMemFree(hTable);
m_bGetUnread=false;
return -1;
}
status = NIFFindView(hDb, szViewName, &ViewID); file://得到数据库的某视图或文件夹
if (status!=NOERROR) {
OSMemFree(hTable);
m_bGetUnread=false;
return -1;
}
status=NIFOpenCollection(hDb,hDb,ViewID,0,hTable,_
&hCollection,NULL,NULL,NULL,NULL);
if (status!=NOERROR) {
OSMemFree(hTable);
m_bGetUnread=false;
return -1;
}
status =NIFUpdateCollection(hCollection);
if (status!=NOERROR) {
NIFCloseCollection(hCollection);
OSMemFree(hTable);
m_bGetUnread=false;
return -1;
}
COLLECTIONPOSITION CollPosition;
CollPosition.Level = 0;
CollPosition.Tumbler[0] = 0;
HANDLE hBuffer;
DWORD NotesFound;
WORD SignalFlags;
Status=NIFReadEntries(hCollection,&CollPosition,_
NAVIGATE_NEXT,1L,NAVIGATE_NEXT,0xFFFF,READ_MASK_NOTEID,_
&hBuffer,NULL,NULL,¬esFound,&SignalFlags);
if (status!=NOERROR) {
NIFCloseCollection(hCollection);
OSMemFree(hTable);
m_bGetUnread=false;
return -1;
}
int iViewUnread=0;
NOTEID NoteID;
BOOL fFirst=TRUE;
unsigned int i;
NOTEID* IdList;
if (hBuffer != NULLHANDLE)
{
IdList = (NOTEID far *)OSLockObject(hBuffer);
while(IDScan(hTable, fFirst, ¬eID)) // 依次取得hTable表中的文档号
{
fFirst = FALSE;
for (i=0; i
if (NoteID==IdList[i]) {
iViewUnread++;
break;
}
}
OSUnlockObject(hBuffer);
OSMemFree(hBuffer);
}
NIFCloseCollection(hCollection);
OSMemFree(hTable);
m_bGetUnread=true;
return iViewUnread;
}
//////////////////////////////////////////
// CloseNotes:关闭Notes数据库
void CNotes::CloseNotes()
{
if (m_bOpened)
NSFDbClose(hDb);
m_bOpened=false;
m_bGetUnread=false;
}
经验:
1、在用NSFDbGetUnreadNoteTable函数取得未读文档列表时,发现在读取本地数据库时,未读文档列表是正确的,而当读取服务器上数据库时(即使你在本地做个复本,再读本地复本的未读文档列表也是一样),总是返回总文档数,即使在用NSFDbUpdateUnread函数更新了未读文档列表后仍是如此,只有在用文档集函数NIFUpdateCollection更新后才能得到真正的未读文档数。
2、在上面得到的未读文档数是整个数据库的全部未读文档,应和视图文档进行对比后才真正得到某视图或文件夹的未读文档。
3、Notes在处理中文时,要求每个中文前都必须有0x13字符才行。所以在处理中文数据库方面,自己还要自行处理中文名问题。
4、要进一步得到文档的字段内容,可以用将以下函数段加入上述函数中。
BOOL fFirst = TRUE;
int j=0;
NOTEHANDLE noteHandle;
while(IDScan(hTable, fFirst, ¬eID))
{
fFirst = FALSE;
for (i=0; i
if (NoteID==IdList[i]) {
if (NSFNoteOpen(hDb, NoteID,0, ?eHandle)==NOERROR) {
NSFItemGetText(noteHandle,szItemName,Buffer[j],MAX_PATH);
}
j++;
break;
}
}
5、本文是实现该功能的主要函数,你可以将其写成一个DLL程序,那么就可以在你的Notes Script脚本程序中来使用它。你也可以利用它写成一个独立的应用程序,你就可以在Notes外部运行它了。
本程序在Windows2000 Server,Visual C++ 6.0下调试通过。如果本文有任何问题,请与作者联系。
参考文献:
Lotus C API 5.0.7 User Guide
Lotus C API 5.0.7 Reference
love7
2004-08-26
打赏
举报
回复
最近我也在想这个问题。可以考虑修改mail模板。
myycr
2004-08-26
打赏
举报
回复
判断文档是否isnewdoc,
drager
2004-08-26
打赏
举报
回复
我也想知道,不过你的分太少了
YuLimin
2004-08-05
打赏
举报
回复
作个标志开关位哦,默认为0,打开为1不就可以进行统计了?
flyingpipo
2004-08-05
打赏
举报
回复
各位高手帮帮我啦,很急切!
flyingpipo
2004-08-04
打赏
举报
回复
给自己顶一下吧,各位帮帮我呀!
Notes 和 Domino 历史回顾
随着
R5
不断加深的 Web 集成,Notes 与 Internet 之间的融合已不再是一个问题 - 它们两者已经不可分割了。
R5
的新用户界面表明了这一点,它具有了很多的浏览器特征。
R5
还支持更多的 Internet 协议,并进行了扩充,...
Lotus Notes历史回顾
随着
R5
不断加深的Web集成,Notes与Internet之间的融合已不再是一个问题——它们两者已经不可分割了。
R5
的新用户界面表明了这一点,它具有了很多的浏览器特征。
R5
还支持更多的Internet协议,并进行了扩充,包括能访问...
【音频处理技术】的相关调研
【音频处理技术】的相关调研
3031434617Mini小车_D版STM32源码_2025.01.13(霍尔编码器) (2) (2).zip
3031434617Mini小车_D版STM32源码_2025.01.13(霍尔编码器) (2) (2).zip
久久在线FLASH系统全新升级版本发布
资源下载链接为: https://pan.quark.cn/s/9e7ef05254f8 【久久在线FLASH系统】是一款专为久久在线网站打造的交互式Flash平台,集成了前台展示与后台管理功能,满足内容发布、管理和用户互动的需求。Flash技术曾广泛应用于网页动画和互动内容,尤其在早期互联网时代,在游戏、广告和多媒体教学等领域发挥了重要作用。该系统的核心包括以下几个关键方面: Flash技术:系统利用Flash创建动态图形、动画和交互内容,依赖Adobe Flash Player运行。其编程语言ActionScript支持面向对象开发,便于实现复杂逻辑和交互效果。 后台管理系统:作为系统的控制中心,后台支持内容上传、编辑、分类、权限设置、用户管理及数据分析,确保内容的有序更新与发布。 产品演示模块:用户可在线预览和体验产品功能,无需下载,通过交互式演示了解产品操作流程和优势。 数据库集成:系统与数据库紧密结合,用于存储Flash文件信息、用户数据及访问记录,实现高效的数据管理与检索。 安全性与优化:系统具备防止非法访问和数据泄露的安全机制,并对Flash内容进行优化,提升加载速度与用户体验。 响应式设计:尽管Flash主要用于桌面端,系统仍考虑多设备兼容性,通过响应式设计适配不同屏幕尺寸,提供一致体验。 API接口:系统支持与其他平台或服务通过API进行数据交互,如社交媒体分享、数据分析等,拓展功能边界。 用户体验:界面设计注重交互性与视觉效果,提升用户满意度和停留时间,增强平台吸引力。 版本控制:系统支持内容版本管理,便于追踪更新历史,方便内容维护与回滚。 性能监控:内置性能监控工具,实时跟踪系统负载与资源使用情况,及时发现并解决问题,保障系统稳定运行。 【久久在线FLASH系统】是一个综合性解决方案,融合了前端展示、后台管理、互动体验和数据分析等功能,体现了当时Web
消息协作
536
社区成员
39,097
社区内容
发帖
与我相关
我的任务
消息协作
企业开发 Exchange Server
复制链接
扫一扫
分享
社区描述
企业开发 Exchange Server
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章