ASP組件實(shí)現(xiàn)Notes新郵件提醒
中文摘要:通過對Domino數(shù)據(jù)庫進(jìn)行研究開發(fā),探索Domino數(shù)據(jù)庫如何和企業(yè)應(yīng)用結(jié)合,如何能讓用戶更快了解數(shù)據(jù)庫中未處理郵件數(shù)量及內(nèi)容,反映到企業(yè)內(nèi)部網(wǎng)站上,來達(dá)到提高辦公工作效率的目的。正文:目前電力系統(tǒng)
中文摘要:
通過對Domino數(shù)據(jù)庫進(jìn)行研究開發(fā),探索Domino數(shù)據(jù)庫如何和企業(yè)應(yīng)用結(jié)合,如何能讓用戶更快了解數(shù)據(jù)庫中未處理郵件數(shù)量及內(nèi)容,反映到企業(yè)內(nèi)部網(wǎng)站上,來達(dá)到提高辦公工作效率的目的。
正文:
目前電力系統(tǒng)中辦公自動化系統(tǒng)使用較多的是Lotus Domino系統(tǒng),Domino是一個(gè)比較獨(dú)特、比較封閉的非關(guān)系數(shù)據(jù)庫管理系統(tǒng)。通過Notes客戶端可以安全方便的收發(fā)郵件,但是Lotus Notes本身是一種C/S模式程序,在強(qiáng)調(diào)系統(tǒng)安全性的同時(shí),給系統(tǒng)管理員和用戶帶來了不少安裝、管理、使用上的麻煩。目前郵件、公文系統(tǒng)使用WEB方式已是大勢所趨,本文針對ASP開發(fā)環(huán)境下對新郵件提醒作一些初步研究,旨在給初學(xué)者提供一種思路。
一、了解Notes/Domino的工具包
首先我們需要了解用什么方法可以從外部得到Domino/Notes系統(tǒng)中的數(shù)據(jù)、對象,Lotus提供了什么樣的接口和工具。IBM公司不愧為藍(lán)色巨人,提供了豐富的Notes/Domino的工具包。
二、新郵件提醒實(shí)現(xiàn)方法:
1、通過Domino代理寫入網(wǎng)關(guān)數(shù)據(jù)庫,前臺程序例如ASP程序通過數(shù)據(jù)庫接口訪問數(shù)據(jù)庫得到新郵件數(shù)目。
2、通過Toolkit工具對新郵件進(jìn)行統(tǒng)計(jì),其中用CAPI實(shí)現(xiàn)功能比較強(qiáng)大,幾乎可以操作Notes數(shù)據(jù)庫中所有的數(shù)據(jù)對象(包括數(shù)據(jù)庫及ACL、文檔和域、表單、視圖、文件夾、代理) 。然后通過ASP程序使用注冊的ATL COM組件來取得Notes的未讀文檔數(shù)。
三、準(zhǔn)備工作
本文準(zhǔn)備利用CAPI新建ATL COM工程來讀出Notes未讀郵件和總郵件數(shù),開發(fā)工具準(zhǔn)備選用Visual C++ 7.0,使用Lotus CAPI的應(yīng)用將根據(jù)notes.ini中的信息來得到當(dāng)前用戶的信息,根據(jù)查找到的ID文件來驗(yàn)證用戶身份。Notes的大部分API都封裝在nNotes.dll文件中,其中包括有ACL,Database,User,Document,Item等各個(gè)方面的API函數(shù)。
在IBM公司網(wǎng)站下載Domino對應(yīng)版本CAPI,解壓至相應(yīng)目錄例如c:\notesapi下,我們這里以Domino5.08舉例,打開目錄可以看到Include目錄和Lib目錄,設(shè)置好系統(tǒng)變量包括系統(tǒng)路徑。
四、編程思路
打開VC++7.0,新建Visual C++項(xiàng)目ATL項(xiàng)目類型,模板選擇ATL項(xiàng)目,取名dmnew,設(shè)置項(xiàng)目屬性添加notes.lib,設(shè)置項(xiàng)目VC++項(xiàng)目CAPI包含文件目錄和庫文件目錄,在項(xiàng)目向?qū)Ю锓?wù)器類型選擇動態(tài)鏈接庫(DLL),添加ATL Active Server Page組件類,取名newmail,其余屬性按默認(rèn)值,在自動生成的Idmnew 接口添加方法getnew([in] BSTR username, [in] BSTR passwd, [out,retval]VARIANT* vOut),
首先需要初始化Notes環(huán)境,打開數(shù)據(jù)庫,使用其自動建立的m_piResponse對象可以在ASP頁面上輸出出錯信息,便于調(diào)試。
error =NotesInit();
if ( error!=NOERROR)
{
OSLoadString(0, ERR(error), szErrorStr, 256 - 1);
varText.vt = VT_BSTR;
varText.bstrVal = CComBSTR(szErrorStr).Copy();
m_piResponse->Write(varText);
return S_OK;
}
使用SECKFMSwitchToIDFile自動切換到指定的ID,這個(gè)API不能支持復(fù)雜密碼,同時(shí)修改Notes.ini相關(guān)配置。
error= SECKFMSwitchToIDFile( idfile, idpassword, idUserName, 100, 0, NULL);
根據(jù)變量server_name,pathname構(gòu)成Domino數(shù)據(jù)庫全路徑,打開數(shù)據(jù)庫。
error = OSPathNetConstruct(NULL, server_name,pathname,full_netpath);
error=NSFDbOpen(full_netpath, &hDb);//打開數(shù)據(jù)庫
取得指定數(shù)據(jù)庫所有的未讀文檔列表,同時(shí)更新內(nèi)存中未讀文檔列表。用戶的未讀標(biāo)志存放在客戶端的desktop.dsk文件和服務(wù)器的數(shù)據(jù)庫,當(dāng)用戶關(guān)閉數(shù)據(jù)庫時(shí),客戶端和服務(wù)器的未讀標(biāo)志會同步。
nameLen=WORD(strlen(zhUserName));
error = NSFDbGetUnreadNoteTable(hDb,zhUserName,nameLen,TRUE,&hTable); error=NSFDbUpdateUnread(hDb,hTable);//
得到數(shù)據(jù)庫中某個(gè)視圖或文件夾的未讀文檔數(shù)和信息
error=NIFFindDesignNoteByName(hDb,zhViewName,&ViewID);
//取得指定視圖或文件夾的所有文檔
error=NIFOpenCollection(hDb,hDb,ViewID,0,hTable,&hCollection,NULL,NULL,NULL,NULL);
error=NIFUpdateCollection(hCollection);
利用NIFReadEntries讀取文檔集的指定文檔,再與前面的所有未讀文檔列表進(jìn)行一一比較,相同的則是該視圖或文件夾的未讀文檔列表。
CollPosition.Level=0;
CollPosition.Tumbler[0]=0;
//讀取文檔集的指定文檔
error=NIFReadEntries(hCollection,&CollPosition,NAVIGATE_NEXT,1L,NAVIGATE_NEXT,0xFFFF,READ_MASK_NOTEID,&hBuffer,NULL,NULL,&NotesFound,&SignalFlags);
if (hBuffer !=NULLHANDLE)
{ IdList=(NOTEID far *)OSLockObject(hBuffer);
while(IDScan(hTable,fFirst,&NoteID))//依次取得hTable表中的文檔號
{ fFirst=FALSE;
for (i=0;i<NotesFound;i++)
if (NoteID==IdList[i])
{ iViewUnread++;
break;
}
}
OSUnlockObject(hBuffer);
OSMemFree(hBuffer);
}
DLL文件中引用m_piResponse對象在ASP頁面顯示總郵件數(shù)目和新郵件數(shù)目。
VariantInit(&varText);
varText.vt = VT_I4;
varText.lVal =NotesFound ;
m_piResponse->Write(CComVariant(L"<div align='left' class='black'><font size=2>共有郵件"));
m_piResponse->Write(varText);
m_piResponse->Write(CComVariant(L"封</font></div>"));
varText.lVal =iViewUnread;
m_piResponse->Write(CComVariant(L"<div align='left' class='black'>其中有<b><font color=red size=2>"));
m_piResponse->Write(varText);
m_piResponse->Write(CComVariant(L"</font></b>封新郵件</div>"));
在ASP文件中調(diào)用已注冊的ATL DLL文件。
dim test
dim retval
set test=Server.CreateObject("dmnew.newmail")
retval=test.getnew("notes文件名","notes密碼")
五、涉及問題
1、中文處理
其中Domino牽涉到中文的部分需要進(jìn)行處理,每個(gè)中文字符前面需要加0x13,GB2312編碼大約包含6000多漢字(不包括特殊字符),編碼范圍為第一位b0-f7,第二位編碼范圍為a1-fe,用以下函數(shù)進(jìn)行處理:
void hangzi_zhuan(char *src,char *des)
{ unsigned char highchar;
unsigned char lowchar;
int l;
int k;
int m;
l=WORD(strlen(src));
for(k= 0,m=0;k<=l;k++,m++)
{
lowchar =( unsigned char)( src[k]);//取源字符串低位
highchar =(unsigned char)(src[k+1]); //取源字符串高位
if ( (highchar>=0xa1) && (highchar<=0xfe) && (lowchar>=0xb0) && (lowchar<=0xf7) )
{
//此字符是漢字
des[m]=0x13;
des[m+1]=lowchar;
des[m+2]=highchar;
k=k+1;
m=m+2;
}
else
{ //此字符不是漢字
des[m]=lowchar;
}
}
}
2、系統(tǒng)變量設(shè)置
在系統(tǒng)變量里面設(shè)置庫文件目錄、包含文件目錄和系統(tǒng)路徑,注意這些路徑設(shè)置總長度不要超過256個(gè)字符,256個(gè)字符以后的設(shè)置將不會起作用。
3、Domino里面郵件數(shù)據(jù)庫的“收件箱”是一個(gè)共享文件夾,它的視圖名稱為“$Inbox”。
參考文獻(xiàn)
Lotus C API 5.0.8 User Guide
Lotus C API 5.0.8 Reference
作者簡介
佘世洲(1975年生),男,1997年安徽大學(xué)電子工程系本科畢業(yè),工程師。
郵件地址:redbug03@163.com
通訊地址:安徽銅陵供電公司信息中心
郵編:244000
電話:0562-2664404
通過對Domino數(shù)據(jù)庫進(jìn)行研究開發(fā),探索Domino數(shù)據(jù)庫如何和企業(yè)應(yīng)用結(jié)合,如何能讓用戶更快了解數(shù)據(jù)庫中未處理郵件數(shù)量及內(nèi)容,反映到企業(yè)內(nèi)部網(wǎng)站上,來達(dá)到提高辦公工作效率的目的。
正文:
目前電力系統(tǒng)中辦公自動化系統(tǒng)使用較多的是Lotus Domino系統(tǒng),Domino是一個(gè)比較獨(dú)特、比較封閉的非關(guān)系數(shù)據(jù)庫管理系統(tǒng)。通過Notes客戶端可以安全方便的收發(fā)郵件,但是Lotus Notes本身是一種C/S模式程序,在強(qiáng)調(diào)系統(tǒng)安全性的同時(shí),給系統(tǒng)管理員和用戶帶來了不少安裝、管理、使用上的麻煩。目前郵件、公文系統(tǒng)使用WEB方式已是大勢所趨,本文針對ASP開發(fā)環(huán)境下對新郵件提醒作一些初步研究,旨在給初學(xué)者提供一種思路。
一、了解Notes/Domino的工具包
首先我們需要了解用什么方法可以從外部得到Domino/Notes系統(tǒng)中的數(shù)據(jù)、對象,Lotus提供了什么樣的接口和工具。IBM公司不愧為藍(lán)色巨人,提供了豐富的Notes/Domino的工具包。
- Lotus C API toolkit
- Lotus C++ API toolkit
- Lotus Domino Toolkit for Java/CORBA
- Lotus and Notes Toolkit for COM
- Lotus Domino Driver for JDBC (簡稱LDDJ)
- NotesSQL
- Lotus XML Toolkit(簡稱DXL)
- Custom Tag Converion kit(簡稱DCT)
- LotusScript Extensions toolkit(簡稱LSX)
二、新郵件提醒實(shí)現(xiàn)方法:
1、通過Domino代理寫入網(wǎng)關(guān)數(shù)據(jù)庫,前臺程序例如ASP程序通過數(shù)據(jù)庫接口訪問數(shù)據(jù)庫得到新郵件數(shù)目。
2、通過Toolkit工具對新郵件進(jìn)行統(tǒng)計(jì),其中用CAPI實(shí)現(xiàn)功能比較強(qiáng)大,幾乎可以操作Notes數(shù)據(jù)庫中所有的數(shù)據(jù)對象(包括數(shù)據(jù)庫及ACL、文檔和域、表單、視圖、文件夾、代理) 。然后通過ASP程序使用注冊的ATL COM組件來取得Notes的未讀文檔數(shù)。
三、準(zhǔn)備工作
本文準(zhǔn)備利用CAPI新建ATL COM工程來讀出Notes未讀郵件和總郵件數(shù),開發(fā)工具準(zhǔn)備選用Visual C++ 7.0,使用Lotus CAPI的應(yīng)用將根據(jù)notes.ini中的信息來得到當(dāng)前用戶的信息,根據(jù)查找到的ID文件來驗(yàn)證用戶身份。Notes的大部分API都封裝在nNotes.dll文件中,其中包括有ACL,Database,User,Document,Item等各個(gè)方面的API函數(shù)。
在IBM公司網(wǎng)站下載Domino對應(yīng)版本CAPI,解壓至相應(yīng)目錄例如c:\notesapi下,我們這里以Domino5.08舉例,打開目錄可以看到Include目錄和Lib目錄,設(shè)置好系統(tǒng)變量包括系統(tǒng)路徑。
四、編程思路
打開VC++7.0,新建Visual C++項(xiàng)目ATL項(xiàng)目類型,模板選擇ATL項(xiàng)目,取名dmnew,設(shè)置項(xiàng)目屬性添加notes.lib,設(shè)置項(xiàng)目VC++項(xiàng)目CAPI包含文件目錄和庫文件目錄,在項(xiàng)目向?qū)Ю锓?wù)器類型選擇動態(tài)鏈接庫(DLL),添加ATL Active Server Page組件類,取名newmail,其余屬性按默認(rèn)值,在自動生成的Idmnew 接口添加方法getnew([in] BSTR username, [in] BSTR passwd, [out,retval]VARIANT* vOut),
首先需要初始化Notes環(huán)境,打開數(shù)據(jù)庫,使用其自動建立的m_piResponse對象可以在ASP頁面上輸出出錯信息,便于調(diào)試。
error =NotesInit();
if ( error!=NOERROR)
{
OSLoadString(0, ERR(error), szErrorStr, 256 - 1);
varText.vt = VT_BSTR;
varText.bstrVal = CComBSTR(szErrorStr).Copy();
m_piResponse->Write(varText);
return S_OK;
}
使用SECKFMSwitchToIDFile自動切換到指定的ID,這個(gè)API不能支持復(fù)雜密碼,同時(shí)修改Notes.ini相關(guān)配置。
error= SECKFMSwitchToIDFile( idfile, idpassword, idUserName, 100, 0, NULL);
根據(jù)變量server_name,pathname構(gòu)成Domino數(shù)據(jù)庫全路徑,打開數(shù)據(jù)庫。
error = OSPathNetConstruct(NULL, server_name,pathname,full_netpath);
error=NSFDbOpen(full_netpath, &hDb);//打開數(shù)據(jù)庫
取得指定數(shù)據(jù)庫所有的未讀文檔列表,同時(shí)更新內(nèi)存中未讀文檔列表。用戶的未讀標(biāo)志存放在客戶端的desktop.dsk文件和服務(wù)器的數(shù)據(jù)庫,當(dāng)用戶關(guān)閉數(shù)據(jù)庫時(shí),客戶端和服務(wù)器的未讀標(biāo)志會同步。
nameLen=WORD(strlen(zhUserName));
error = NSFDbGetUnreadNoteTable(hDb,zhUserName,nameLen,TRUE,&hTable); error=NSFDbUpdateUnread(hDb,hTable);//
得到數(shù)據(jù)庫中某個(gè)視圖或文件夾的未讀文檔數(shù)和信息
error=NIFFindDesignNoteByName(hDb,zhViewName,&ViewID);
//取得指定視圖或文件夾的所有文檔
error=NIFOpenCollection(hDb,hDb,ViewID,0,hTable,&hCollection,NULL,NULL,NULL,NULL);
error=NIFUpdateCollection(hCollection);
利用NIFReadEntries讀取文檔集的指定文檔,再與前面的所有未讀文檔列表進(jìn)行一一比較,相同的則是該視圖或文件夾的未讀文檔列表。
CollPosition.Level=0;
CollPosition.Tumbler[0]=0;
//讀取文檔集的指定文檔
error=NIFReadEntries(hCollection,&CollPosition,NAVIGATE_NEXT,1L,NAVIGATE_NEXT,0xFFFF,READ_MASK_NOTEID,&hBuffer,NULL,NULL,&NotesFound,&SignalFlags);
if (hBuffer !=NULLHANDLE)
{ IdList=(NOTEID far *)OSLockObject(hBuffer);
while(IDScan(hTable,fFirst,&NoteID))//依次取得hTable表中的文檔號
{ fFirst=FALSE;
for (i=0;i<NotesFound;i++)
if (NoteID==IdList[i])
{ iViewUnread++;
break;
}
}
OSUnlockObject(hBuffer);
OSMemFree(hBuffer);
}
DLL文件中引用m_piResponse對象在ASP頁面顯示總郵件數(shù)目和新郵件數(shù)目。
VariantInit(&varText);
varText.vt = VT_I4;
varText.lVal =NotesFound ;
m_piResponse->Write(CComVariant(L"<div align='left' class='black'><font size=2>共有郵件"));
m_piResponse->Write(varText);
m_piResponse->Write(CComVariant(L"封</font></div>"));
varText.lVal =iViewUnread;
m_piResponse->Write(CComVariant(L"<div align='left' class='black'>其中有<b><font color=red size=2>"));
m_piResponse->Write(varText);
m_piResponse->Write(CComVariant(L"</font></b>封新郵件</div>"));
在ASP文件中調(diào)用已注冊的ATL DLL文件。
dim test
dim retval
set test=Server.CreateObject("dmnew.newmail")
retval=test.getnew("notes文件名","notes密碼")
五、涉及問題
1、中文處理
其中Domino牽涉到中文的部分需要進(jìn)行處理,每個(gè)中文字符前面需要加0x13,GB2312編碼大約包含6000多漢字(不包括特殊字符),編碼范圍為第一位b0-f7,第二位編碼范圍為a1-fe,用以下函數(shù)進(jìn)行處理:
void hangzi_zhuan(char *src,char *des)
{ unsigned char highchar;
unsigned char lowchar;
int l;
int k;
int m;
l=WORD(strlen(src));
for(k= 0,m=0;k<=l;k++,m++)
{
lowchar =( unsigned char)( src[k]);//取源字符串低位
highchar =(unsigned char)(src[k+1]); //取源字符串高位
if ( (highchar>=0xa1) && (highchar<=0xfe) && (lowchar>=0xb0) && (lowchar<=0xf7) )
{
//此字符是漢字
des[m]=0x13;
des[m+1]=lowchar;
des[m+2]=highchar;
k=k+1;
m=m+2;
}
else
{ //此字符不是漢字
des[m]=lowchar;
}
}
}
2、系統(tǒng)變量設(shè)置
在系統(tǒng)變量里面設(shè)置庫文件目錄、包含文件目錄和系統(tǒng)路徑,注意這些路徑設(shè)置總長度不要超過256個(gè)字符,256個(gè)字符以后的設(shè)置將不會起作用。
3、Domino里面郵件數(shù)據(jù)庫的“收件箱”是一個(gè)共享文件夾,它的視圖名稱為“$Inbox”。
參考文獻(xiàn)
Lotus C API 5.0.8 User Guide
Lotus C API 5.0.8 Reference
作者簡介
佘世洲(1975年生),男,1997年安徽大學(xué)電子工程系本科畢業(yè),工程師。
郵件地址:redbug03@163.com
通訊地址:安徽銅陵供電公司信息中心
郵編:244000
電話:0562-2664404
責(zé)任編輯:和碩涵
免責(zé)聲明:本文僅代表作者個(gè)人觀點(diǎn),與本站無關(guān)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實(shí),對本文以及其中全部或者部分內(nèi)容、文字的真實(shí)性、完整性、及時(shí)性本站不作任何保證或承諾,請讀者僅作參考,并請自行核實(shí)相關(guān)內(nèi)容。
我要收藏
個(gè)贊
-
現(xiàn)貨模式下谷電用戶價(jià)值再評估
2020-10-10電力現(xiàn)貨市場,電力交易,電力用戶 -
PPT | 高校綜合能源服務(wù)有哪些解決方案?
2020-10-09綜合能源服務(wù),清潔供熱,多能互補(bǔ) -
深度文章 | “十三五”以來電力消費(fèi)增長原因分析及中長期展望
2020-09-27電力需求,用電量,全社會用電量
-
PPT | 高校綜合能源服務(wù)有哪些解決方案?
2020-10-09綜合能源服務(wù),清潔供熱,多能互補(bǔ) -
深度文章 | “十三五”以來電力消費(fèi)增長原因分析及中長期展望
2020-09-27電力需求,用電量,全社會用電量 -
我國電力改革涉及的電價(jià)問題
-
電化學(xué)儲能應(yīng)用現(xiàn)狀及對策研究
2019-08-14電化學(xué)儲能應(yīng)用 -
《能源監(jiān)測與評價(jià)》——能源系統(tǒng)工程之預(yù)測和規(guī)劃
-
《能源監(jiān)測與評價(jià)》——能源系統(tǒng)工程之基本方法
-
貴州職稱論文發(fā)表選擇泛亞,論文發(fā)表有保障
2019-02-20貴州職稱論文發(fā)表 -
《電力設(shè)備管理》雜志首屆全國電力工業(yè) 特約專家征文
2019-01-05電力設(shè)備管理雜志 -
國內(nèi)首座蜂窩型集束煤倉管理創(chuàng)新與實(shí)踐
-
人力資源和社會保障部:電線電纜制造工國家職業(yè)技能標(biāo)準(zhǔn)
-
人力資源和社會保障部:變壓器互感器制造工國家職業(yè)技能標(biāo)準(zhǔn)
-
《低壓微電網(wǎng)并網(wǎng)一體化裝置技術(shù)規(guī)范》T/CEC 150
2019-01-02低壓微電網(wǎng)技術(shù)規(guī)范
-
現(xiàn)貨模式下谷電用戶價(jià)值再評估
2020-10-10電力現(xiàn)貨市場,電力交易,電力用戶 -
建議收藏 | 中國電價(jià)全景圖
2020-09-16電價(jià),全景圖,電力 -
一張圖讀懂我國銷售電價(jià)附加
2020-03-05銷售電價(jià)附加