Outlook的Automation物件編程方法 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
Outlook的Automation物件編程方法 東北大學 張春明 薑紹飛 張春麗 Microsoft Outlook是可編程桌面資訊管理程式。由於Microsoft Outlook本身不包含Visual Basic for Applications,但包括完整的類型庫(type library)和Visual Basic Scripting Edition (VBScript),因此,Outlook物件編程可以採用兩種方法:即VBScript腳本編程方法和Automation自動化編程方法。
VBScript腳本編程方法一般用於設計基於Outlook的本地化解決方案;而Automation(或OLE Automation)自動化編程方法則是用於建立用戶自己的群件或郵件系統。可以使用早期綁定或後期綁定來開始一個Automation過程。本文將以後期綁定爲例介紹在Delphi 5編程環境下,Outlook的Automation物件編程方法。
Outlook物件模型
Outlook基於Microsoft Exchange消息系統,更具體地說是基於MAPI(Messaging Application Programming Interface)來存儲資料。若將Outlook安裝到一台沒有其他任何消息元件的電腦中,則安裝程式會自動安裝基於MAPI的Microsoft Exchange消息系統。
與任何一種消息系統一樣,Microsoft Exchange使用一個層次化的文件夾(Folder)集合來存儲資料。文件夾可以包含子文件夾(如收件箱、發件箱等)和條目(Item)(如郵件消息、約會、聯繫人和任務等)。正是由於這種不確定性,使Outlook編程與以文檔爲中心的其他Office産品編程相比更具挑戰性,是所有Microsoft Office程式中物件編程最複雜的一種。Automation解決方案在很大程度上就是在這種文件夾層次中導航。
在Outlook物件模型中,Application物件包含NameSpace物件;NameSpace物件包含給定資料源(如MAPI消息庫)中所有文件夾,即MAPIFolder物件集合;MAPIFolder物件包含該文件夾中所有條目物件;每個條目物件包含用於對其進行控制的可編程物件。
各物件含義如下:
●Application物件是整個模型的根物件,由CreateOleObject或GetActiveOleObject 函數返回;
●NameSpace物件代表任何可識別資料源,如MAPI消息庫;
●Folders物件集合包括指定消息庫(或任何可識別資料源)及其下級文件夾中所有的MAPIFolder文件夾物件;
●Items物件集合包括指定文件夾中所有Item條目物件;
●Explorer物件用於顯示一個文件夾的視窗;
●Inspector物件用於顯示一個條目的視窗。
Outlook物件編程步驟
1.在Delphi 5中,採用後期綁定來初始化一個Automation過程時,建議引用outlook8.pas單元,該單元包括Outlook類型庫中所用常量定義。
2.建立一個Application類的實例。
3.調用GetNamespace過程指定要使用的名字空間。
若使用後期綁定,則所有物件變數均必須爲Variant類型,如OutlookApplication, OutlookNameSpace等。
OutlookNameSpace:=Outlook.GetNamespace
(‘MAPI’);
4.調用Outlook名字空間的Logon 方法登記到郵件系統。該方法的四個參數的含義分別爲Microsoft Exchange Profile檔案名、口令、是否顯示標準登錄對話方塊、是否建立一個新的Microsoft Exchange會話。例如:
OutlookNameSpace.Logon(ProfileStr, PasswordStr, False, True);
5.調用Outlook名字空間的GetDefaultFolder方法返回所請求的默認的MapiFolder文件夾物件(即MAPI名字空間內的一個文件夾)。例如,將默認的Contacts文件夾物件賦給OutlookFolder變數的方法如下:
OutlookFolder := OutlookNameSpace.
GetDefaultFolder(olFolderContacts);
又如,下列語句可以顯示發件箱文件夾名稱:
Caption := Variant(OutlookNameSpace.
GetDefaultFolder(olFolderOutbox));
此外,還可以使用文件夾集合Folders(索引)方法查找文件夾。這是查找自定義、非標準文件夾的唯一方法。如:
urgentFolder := olMAPI.Folders(“Mailbox - Zhang Chunming”).Folders(“Urgent”);
下面例子顯示收件人ZhangChunming的共用日曆文件夾:
OutlookReciepientItem := OutlookNameSpace.
CreateRecipient(‘ZhangChunming’);
OutlookReciepientItem.Resolve;
if OutlookReciepientItem.Resolved <> 0 then
begin
OutlookFolder := OutlookNameSpace.
GetSharedDefaultFolder(OutlookReciepientItem,
olFolderCalendar);
OutlookFolder.Display;
end;
6.用MAPIFolder物件的Items屬性返回該物件包含的條目物件集合。
有三種方法可以返回指定的條目物件:
●可以用Items(名字)方法返回指定的條目物件。如:下面語句返回指定文件夾中題目爲“會議通知”的條目物件:
OutlookMailItem:=OutlookFolder.Items(‘會議通知’);
●也可以用Items(索引)方法返回指定的條目物件。返回指定文件夾中第一個條目物件的方法如下:
OutlookMailItem := OutlookFolder.Items(1);
下面例子遍曆指定文件夾(MAPIFolder物件)中所有條目物件集合,並顯示條目主題。
for i := 1 to OutlookFolder.Items.Count do
begin
Caption := Caption +‘-’ + String(OutlookFolder.Items[i]);
OutlookFolder.Items[i].Display;
end;
注意:若指定文件夾不包括任何條目,則Items物件集合的Count屬性爲0。
●還可以用Items條目集合的Find方法查找條目。這是在Outlook文件夾中查找那些沒有唯一標識的條目的唯一可行的方法。如:
OutlookMailItem := OutlookFolder.Items.Find(‘[Subject] = “會議通知”’);
一旦找到滿足搜索條件的第一個條目,可以用FindNext方法繼續搜索其餘條目。
有兩種方法可以建立新條目物件:
●用Application物件的CreateItem方法創建默認條目物件,如AppointmentItem、ContactItem、JournalItem、MailItem、NoteItem、PostItem或TaskItem等。Outlook自動將新建條目保存到默認文件夾中。下面語句創建一個新郵件:
OutlookMailItem := Outlook.CreateItem
(olMailItem);
下面語句創建一個新聯繫人:
OutlookContactItem := Outlook.CreateItem(olContactItem);
●用Items物件集合的Add方法創建指定類型的條目物件。若未指定條目物件類型,則默認爲父文件夾條目物件類型。若該文件夾從未指定類型,則默認條目物件類型爲MailItem。下面語句將在當前Contacts文件夾中新建一個ContactItem條目。
OutlookContactItem := Outlook.GetNamespace
(‘MAPI’).GetDefaultFolder (olFolderContacts)
.Items.Add;
也可以如下所示分成幾行語句完成:
OutlookNameSpace := Outlook.GetNamespace(‘MAPI’);
OutlookFolder := OutlookNameSpace.
GetDefaultFolder(olFolderContacts);
OutlookContactItem := OutlookFolder.Items.Add(olContactItem);
還可以使用自定義表單向當前Contacts文件夾中加入新聯繫人,如:
OutlookFolder := OutlookNameSpace.
GetDefaultFolder(olFolderContacts);
OutlookContact := OutlookFolder.Items.Add(‘IPM.Contact.MyForm’);
最後,調用Item物件的Save或Send方法保存或發送新建條目。
不論是MAPIFolder物件還是Item物件,均可以調用Display方法顯示對應的視窗。如OutlookContactFolder.Display可以顯示聯繫人文件夾,OutlookTaskItem.Display可以顯示任務條視窗等。
OutlookTaskItem.Display;
編程實例:創建並發送一個新郵件消息
首先調用發件箱文件夾Items條目物件集合的Add方法創建新郵件條目物件(olMailItem類型);其次調用Recipients 物件集合的Add方法來創建一個收件人,調用Attachments物件集合的Add方法來增加一個附件;然後設置郵件消息的Subject(主題)、Body(正文)(事實上所有Outlook物件都有主題和正文屬性)、To(收件人)等屬性;最後調用Send方法發送郵件。
完整的程式清單如下所示:
procedure SendMail;
var
Outlook: variant;{ Application }
OutlookNameSpace: variant;{ NameSpace }
OutlookFolder: variant;{ MAPIFolder }
OutlookMailItem: variant;{ MailItem }
OutlookRecipient: variant;{ Recipient }
OutlookAttachment: variant;{ Attachment }
begin
try
Outlook:=CreateOleObject(‘Outlook.
Application’);
except
ShowMessage(‘無法啓動Microsoft Outlook!’);
Exit;
end;
try
OutlookNameSpace := Outlook.GetNamespace(‘MAPI’);
{ 創建新郵件消息 }
OutlookFolder := OutlookNameSpace.GetDefault
Folder(olFolderOutbox);
{ 增加收件人(若地址薄中已有此人,則僅用其名字即可,否則必須包括完整地址,如OutlookNameSpace.CurrentUser.Address)}
OutlookMailItem := OutlookFolder.Items.Add(olMailItem);
OutlookRecipient := OutlookMailItem.
Recipients.
Add(‘ZhangChunming’);
OutlookRecipient.Type := olTo;
if not OutlookRecipient.Resolve then
begin
ShowMessage(‘無法解析地址!’);
Exit;
end;
{ 插入附件(確保路徑正確) }
OutlookAttachment := OutlookMailItem.
Attachments.Add(‘c:\readme.txt’);
OutlookAttachment.DisplayName := ‘樣本附件’;
{ 設置郵件主題、郵件正文和重要性 }
OutlookMailItem.Subject := ‘郵件主題’;
OutlookMailItem.Body := ‘此處爲郵件內容’;
OutlookMailItem.Importance := olImportanceHigh;
OutlookMailItem.Send;
finally
OutlookRecipient := Unassigned;
OutlookAttachment := Unassigned;
OutlookMailItem := Unassigned;
OutlookFolder := Unassigned;
OutlookNameSpace := Unassigned;
Outlook := Unassigned;
end;
注意:爲避免程式運行時産生異常,程式做了相應的異常處理,如:調用收件人的Resolve方法以確保收件人的有效性等 *********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together!
希望能大家敞開心胸,將知識寶庫結合一起
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |