社区
消息协作
帖子详情
iNotes(R5里面的)是怎样标识邮件是否已阅读的?
flyingpipo
2004-08-04 09:31:25
各位,我现在需要用iNotes里面取一个数据,即未读邮件的数量,iNotes(R5里面的)是怎样标识邮件是否已阅读的?急切希望得到各位的答复!
...全文
369
7
打赏
收藏
iNotes(R5里面的)是怎样标识邮件是否已阅读的?
各位,我现在需要用iNotes里面取一个数据,即未读邮件的数量,iNotes(R5里面的)是怎样标识邮件是否已阅读的?急切希望得到各位的答复!
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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
打赏
举报
回复
给自己顶一下吧,各位帮帮我呀!
园区如何进行科学招商,吸引优质科技项目?.docx
园区如何进行科学招商,吸引优质科技项目?
【Python编程】Python列表推导式与生成器表达式性能对比
内容概要:本文深入解析Python列表推导式与生成器表达式的底层执行差异,重点对比二者在内存占用、惰性求值、迭代效率上的本质区别。文章从字节码层面出发,详解列表推导式的预分配策略与生成器表达式的状态机暂停机制,探讨在百万级数据处理中的内存峰值差异。通过timeit基准测试展示嵌套推导式的笛卡尔积生成、条件过滤的短路优化、以及生成器表达式的链式组合用法,同时介绍字典推导式与集合推导式的哈希表构建优势、海象运算符在推导式中的变量复用技巧,最后给出在大数据流处理、内存受限环境、实时计算等场景下的表达式选型策略与性能调优建议。 1900kk.com ligue1.3p42hwru.com www.3djf.com www.17kuaibu.com www.432u.cn
通信行业基于Java环境配置的高可靠话单处理与5G网元系统构建:实现高并发、低延迟、强一致性的云原生计费与信令控制平台设计
内容概要:本文围绕Java环境配置在通信行业中的实际应用展开,重点阐述了如何通过标准化JDK版本、构建工具、容器化运行环境及配置管理,支撑话单处理、在线计费、5G网元等高并发、低延迟、强一致性的通信系统。文章以话单消费服务为例,深入剖析了Kafka消费者设计、JDBC批量插入、容器感知JVM参数配置、异常处理机制与可观测性集成等关键技术细节,强调Java环境配置在通信领域不仅是运行基础,更是保障系统稳定性与可维护性的工程规范。; 适合人群:具备Java开发基础,从事通信行业系统开发、运维或架构工作的1-5年经验研发人员;尤其适用于参与计费、网管、信令、风控等系统的工程师。; 使用场景及目标:①掌握通信级Java应用的环境标准化配置方法;②理解高吞吐话单处理服务的设计与调优要点;③构建可在多厂商、多机房环境下稳定运行的Java微服务;④实现与K8s、Prometheus、Kafka等云原生组件的深度集成。;
阅读
建议:此文档强调工程实践,建议结合代码案例在真实环境中部署调试,重点关注JVM容器化参数、配置外部化、异常传播机制与监控接入方式,理解每一行配置背后的通信业务约束与可靠性考量。
央企如何通过数据驱动实现创新布局的科学决策?.docx
央企如何通过数据驱动实现创新布局的科学决策?
GCDRNet-Cpp-WinForms-v1-win-x64.zip
GCDRNet-Cpp-WinForms-v1-win-x64.zip 博客地址:https://blog.csdn.net/lw112190/article/details/168003139
消息协作
536
社区成员
39,094
社区内容
发帖
与我相关
我的任务
消息协作
企业开发 Exchange Server
复制链接
扫一扫
分享
社区描述
企业开发 Exchange Server
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章