读取outlook的邮件问题。 (200分)

  • 主题发起人 主题发起人 BlackDragon
  • 开始时间 开始时间
B

BlackDragon

Unregistered / Unconfirmed
GUEST, unregistred user!
var
Item: IDispatch;
InboxFolder: MAPIFolder;
i:integer;
NmSpace:NameSpace;
MailItem1:TMailItem;
ContactItem1:ContactItem;
begin
outlook.Connect;
NmSpace := Outlook.GetNamespace('MAPI');
NmSpace.Logon('', '', False, False);
InboxFolder := NmSpace.GetDefaultFolder(olFolderinbox);
for i := 1 to InboxFolder.Items.Count do
begin
Item := InboxFolder.Items.Item(i);
MailItem1.ConnectTo(Item as _MailItem); //这句怎么出错?该如何写?
MailItem1.SaveAs('F:/OA'+MailItem1.Subject+'.txt', olDoc);
showmessage(MailItem1.Body);
end;
 
是不是NmSpace.Logon('', '', False, False);
没有注册上呀,瞎猜的。
 
我的问题是如何读取outlook邮件。环境是outlookxp,delphi7,
 
我叫老大看去~~
 
这个先给你,不知道你是否看过。[:)]
By Bill Todd


Outlook from Delphi
Automating Microsoft Outlook
Microsoft Office 97 appears to be five well-integrated applications. It is, in fact, much more. Office 97 was created using Microsoft's Component Object Model (COM). The Office applications are composed of a series of COM servers you can access from your Delphi applications using Automation (formerly know as OLE Automation). Beginning with Outlook 98, this article series will explore the object model of each of the office applications - and how you can use them from Delphi.
The Outlook object model consists of objects and collections of objects (see Figure 1). The top-level object in Outlook 98 is the Application object. The Application object is the root of the object tree and provides access to all the other Outlook objects. The Application object is unique in that it's the only object you can gain access to by calling CreateOleObject from a Delphi (or any other) application. Next comes the NameSpace object, which provides access to a data source. The only available data source in Outlook 98 is the MAPI message store.
Figure 1: The Outlook object model.
The MAPIFolders collection is just that - a collection of MAPI folders. You can think of collections as arrays of objects, somewhat like a Delphi TList. However, collection objects can be referenced by name or number. The MAPIFolder object in Figure 1 represents one of the folders in the MAPIFolders collection. Each MAPIFolder contains a Folders collection, and each of these contains an Items collection that contains the items appropriate to that folder. For example, the Contacts folder contains contact items.
Figure 2 shows the main form of a Delphi project that displays the MAPIFolders collection, the Folders collection of the MAPI Personal folder, and the Items in the Contacts folder. Listing One displays the code from the Open Outlook button's OnClick event handler.
Figure 2: The MAPI Folders collection displayed in a Delphi form.
The code in Listing One begins by declaring four Variant variables for use as references to various Outlook objects. The call to CreateOleObject loads the Outlook server and returns a reference to the Application object. The parameter passed to CreateOleObject, Outlook.Application, is the class name Outlook registers itself as when it's installed. Using the Application object you can get a reference to any other Outlook object.
Calling the Application object's GetNameSpace method returns a reference to the NameSpace passed as a parameter. Using the MAPI NameSpace reference variable, Mapi, the code loops through the MAPIFolders collection and adds the name of each folder to the MapiList listbox. As with all objects in object-oriented programming, Outlook objects have properties, methods, and events. The Count property of the Folders collection is used to limit the number of times the for loop executes. All collections have a Count property to provide the number of objects in the collection. Each Folder in the MAPIFolders collection also has a Name property.
As you can see in Figure 2, the MAPIFolders collection contains two folders, Microsoft Mail Shared Folders and Personal Folders. The following statement gets a reference to the Personal Folders collection from the MAPIFolders collection. While the for loop that displayed the names of the MAPI Folders accessed the MAPIFolders collection by number, the statement:
Personal := Mapi.Folders('Personal Folders');
indexes the collection by name. The next for loop uses the reference to the Personal Folder to display the names of all the folders in its Folders collection in the second listbox in Figure 2. The code then gets a reference to the Contacts folder and uses it to loop through the Contacts folder's Items collection. One of the properties of a Contact item is FullName; this property is added to the third listbox to display the names of the contacts.
Clearly, the secret to working with Outlook 98 from your Delphi applications is understanding the Outlook object hierarchy and the properties, methods, and events of each object. Outlook 97 includes a Help file, VBAOUTL.HLP, that contains this information; however, I have been unable to find it on the Outlook 98 CD. Fortunately, very little has changed in Outlook 98. (Outlook 2000 is a different story, and will be the topic of a future article.)
Working with Contacts
Listing Two shows the OnClick event handler from the LoadTbl project that accompanies this article. This code demonstrates how to search the Outlook Contacts folder for the records you wish to select and copy them to a database table.
As in the example shown in Listing One, this one begins by getting the Application object and the MAPI NameSpace object. Next, a reference is obtained using the statement:
ContactItems := Mapi.Folders('Personal Folders').
Folders('Contacts').Items;
This statement demonstrates how you can chain objects together using dot notation to get a reference to a low-level object without having to get individual references to each of the higher level objects. In this case, five levels of intervening objects are specified to get to the Items object of the Contacts folder. These objects are:

The MAPI NameSpace object
The Folders collection
The Personal Folders object
The Folders collection
The Contacts object

You can use this notation to get a reference to any Outlook object in a single statement. The next new feature of this method is the call to the Find method of the ContactItems collection. Almost all collection objects have a Find method you can use to locate a particular item in the collection using one or more of its properties. In this example, the statement:
CurrentContact := ContactItems.Find(' [CompanyName] = ' +QuotedStr('Borland International'));
finds the first contact item where the value of the CompanyName property is equal to Borland International. If no matching item is found, the Variant CurrentContact will be empty. The while loop inserts a new record into the database table, and assigns each of the Contact item's properties to the corresponding field in the table. The while loop continues until CurrentContact is empty, indicating that no more items matching the search criteria can be found. At the end of the while loop, the call to FindNext finds the next matching record, if there is one. If no record is found, CurrentContact is set to empty and the loop terminates.
Creating new Contact folders and records is just as easy. Suppose you want to copy all your Contact records for Borland employees into a new folder. The code in Listing Three from the NewFolder sample project will do the job.
This method begins by getting the Application, MAPI NameSpace, and Contacts folder's Items object. Next, it uses a for loop to scan the Folders collection looking for the Borland Contacts folder. If the folder is found, its number is assigned to the ToRemove variable. The Borland Contacts folder is deleted by calling the Folders collection's Remove method and passing the ToRemove variable as the parameter.
Next, a call to the Folders collection's Add method creates the Borland Contacts folder. Add takes two parameters. The first is the name of the folder to be created. The second parameter is the folder type and can be olFolderCalendar, olFolderContacts, olFolderInbox, olFolderJournal, olFolderNotes, or olFolderTasks. To find the values of these and any other constants you need, search the VBAOUTL.HLP file for Microsoft Outlook Constants. The next statement gets a reference to the new Borland Contacts folder and stores it in the BorlandContacts variable.
A call to the Contacts folder's Items collection's Find method locates the first record for a Borland employee. The while loop is used to iterate through all the Borland employees in the Contacts folder. At the top of the loop a new record is added to the Borland Contacts folder by calling the folder's Items collection's Add method.
Add takes no parameters; it simply inserts a new empty record and returns a reference to the new record, which is saved in the NewContact variable. The statements that follow assign values from the existing record to the new one. Finally, the new record's Save method is called. This is a critical step. If you don't call Save, no errors will be generated - but there will be no new records in the folder. When the while loop terminates Outlook is closed by assigning the constant Unassigned to the OutlookApp variable.
Other Outlook Objects
The Folders collection of the Personal Folder object contains the following folders:

Deleted Items
Inbox
Outbox
Sent Items
Calendar
Contacts
Journal
Notes
Tasks
Drafts

You can work with the Items collection of any of these folders using the same code shown for working with Contacts. Only the properties of the items are different. Listing Four shows a method that copies to a Paradox table all appointments that are all-day events and whose start date is greater than 4/27/99. This example copies the Start, End, Subject and BusyStatus properties to the table. Note that this example uses a more sophisticated find expression than previous examples. Find supports the >, <, >=, <=, = and <> operators, as well as the logical operators and, or, and not, which allows you to construct complex search expressions.
Conclusion
Delphi applications can easily act as Automation clients, allowing your applications to interact with the Microsoft Office Suite applications in any way you wish. Using Outlook you can extract contact information to update a central database, add new contacts derived from other sources, create new folders, and add items of any type. One of Outlook's limitations is its lack of a powerful reporting tool. With a Delphi application you can provide much more powerful reporting capabilities for Outlook data. With a basic understanding of the Outlook object model and a copy of the VBAOUTL.HLP help file you are well on your way.
The projects referenced in this article are available for download.
Bill Todd is president of The Database Group, Inc., a database consulting and development firm based near Phoenix. He is a Contributing Editor of Delphi Informant, co-author of four database-programming books and over 60 articles, and a member of Team Borland, providing technical support on the Borland Internet newsgroups. He is a frequent speaker at Borland Developer Conferences in the US and Europe. Bill is also a nationally known trainer and has taught Paradox and Delphi programming classes across the country and overseas. He was an instructor on the 1995, 1996, and 1997 Borland/Softbite Delphi World Tours. He can be reached at mailto:bill@dbginc.com, or (602) 802-0178.

*)






//begin Listing One - Displaying Outlook objects


procedure TForm1.OpenBtnClick(Sender: TObject);
var
OutlookApp,
Mapi,
Contacts,
Personal: Variant;
I: Integer;
begin
{ Get the Outlook Application object. }
OutlookApp := CreateOleObject('Outlook.Application');
{ Get the MAPI NameSpace object. }
Mapi := OutlookApp.GetNameSpace('MAPI');
{ Loop through the MAPI Folders collection and add the Name of each folder to the listbox. }
for I := 1 to Mapi.Folders.Count do
MapiList.Items.Add(Mapi.Folders(I).Name);
{ Get the Personal folder from the MAPI folders collection. }
Personal := Mapi.Folders('Personal Folders');
{ Loop through the Personal Folders Collection and add the name of each folder to the listbox. }
for I := 1 to Personal.Folders.Count do
PersonalList.Items.Add(Personal.Folders(I).Name);
{ Get the Contacts folder from the Personal Folders collection. }
Contacts := Personal.Folders('Contacts');
{ Loop through the Contacts folder's Items collection and add the FullName property of each Item to the listbox. }
for I := 1 to Contacts.Items.Count do
ContactsList.Items.Add(Contacts.Items(I).FullName);
{ Close Outlook. }
OutlookApp := Unassigned;
end;

//end Listing One


//begin Listing Two - Searching for contacts

procedure TLoadTableForm.LoadBtnClick(Sender: TObject);
var
OutlookApp,
Mapi,
ContactItems,
CurrentContact: Variant;
begin
{ Get the Outlook Application object. }
OutlookApp := CreateOleObject('Outlook.Application');
{ Get the MAPI NameSpace object. }
Mapi := OutlookApp.GetNameSpace('MAPI');
{ Get the Items collection from the Contacts folder. If you don't do this, FindNext will not work. }
ContactItems := Mapi.Folders('Personal Folders').
Folders('Contacts').Items;
{ Load Contacts into table. }
with ContactTable do
begin
EmptyTable;
Open;
DisableControls;
CurrentContact := ContactItems.Find('[CompanyName] = ' + QuotedStr('Borland International'));
while not VarIsEmpty(CurrentContact) do
begin
Insert;
FieldByName('EntryId').AsString := CurrentContact.EntryId;
FieldByName('LastName').AsString := CurrentContact.LastName;
FieldByName('FirstName').AsString := CurrentContact.FirstName;
FieldByName('CompanyName').AsString := CurrentContact.CompanyName;
FieldByName('BusAddrStreet').AsString := CurrentContact.BusinessAddressStreet;
FieldByName('BusAddrPOBox').AsString := CurrentContact.BusinessAddressPostOfficeBox;
FieldByName('BusAddrCity').AsString := CurrentContact.BusinessAddressCity;
FieldByName('BusAddrState').AsString := CurrentContact.BusinessAddressState;
FieldByName('BusAddrPostalCode').AsString := CurrentContact.BusinessAddressPostalCode;
FieldByName('BusinessPhone').AsString := CurrentContact.BusinessTelephoneNumber;
Post;
CurrentContact := ContactItems.FindNext;
end; // while
EnableControls;
end; // with
{ Close Outlook. }
OutlookApp := Unassigned;
end;

//end Listing Two



//begin Listing Three - Creating a Contacts folder and new contacts

procedure TCreateFolderFrom.CreateBtnClick(Sender: TObject);
const
olFolderContacts = 10;
olContactItem = 2;
var
OutlookApp,
Mapi,
NewContact,
BorlandContacts,
ContactItems,
CurrentContact: Variant;
I,
ToRemove: Integer;
begin
{ Get the Outlook Application object. }
OutlookApp := CreateOleObject('Outlook.Application');
{ Get the MAPI NameSpace object. }
Mapi := OutlookApp.GetNameSpace('MAPI');
{ Get the Items collection from the Contacts folder. If you don't do this,FindNext will not work. }
ContactItems := Mapi.Folders('Personal Folders').Folders('Contacts').Items;
{ Remove the test folder. }
ToRemove := 0;
for I := 1 to Mapi.Folders('Personal Folders').Folders.Count do
if Mapi.Folders('Personal Folders').Folders(I).Name = 'Borland Contacts' then
begin
ToRemove := I;
Break;
end; // if
if ToRemove <> 0 then
Mapi.Folders('Personal Folders').Folders.Remove(ToRemove);
{ Create a new folder. }
Mapi.Folders('Personal Folders').Folders.Add('Borland Contacts', olFolderContacts);
BorlandContacts := Mapi.Folders('Personal Folders').Folders('Borland Contacts');
{ Load Contacts into new folder. }
CurrentContact := ContactItems.Find('[CompanyName] = ' + QuotedStr('Borland International'));

while not VarIsEmpty(CurrentContact) do
begin
{ Add a new item to the folder. }
NewContact := BorlandContacts.Items.Add;
{ Assign values to the fields in the item record. }
NewContact.FullName := 'John Doe';
NewContact.LastName := CurrentContact.LastName;
NewContact.FirstName := CurrentContact.FirstName;
NewContact.CompanyName := CurrentContact.CompanyName;
NewContact.BusinessAddressStreet := CurrentContact.BusinessAddressStreet;
NewContact.BusinessAddressPostOfficeBox := CurrentContact.BusinessAddressPostOfficeBox;
NewContact.BusinessAddressCity := CurrentContact.BusinessAddressCity;
NewContact.BusinessAddressState := CurrentContact.BusinessAddressState;
NewContact.BusinessAddressPostalCode := CurrentContact.BusinessAddressPostalCode;
NewContact.BusinessTelephoneNumber := CurrentContact.BusinessTelephoneNumber;
{ Save the new record. }
NewContact.Save;
{ Find the next record in the Contacts folder. }
CurrentContact := ContactItems.FindNext;
end; // while
{ Close Outlook. }
OutlookApp := Unassigned;
end;

//end Listing Three

//begin Listing Four - Reading Calendar folder

procedure TLoadTableForm.LoadBtnClick(Sender: TObject);
var
OutlookApp,
Mapi,
ApptItems,
CurrentAppt: Variant;
begin
{ Get the Outlook Application object. }
OutlookApp := CreateOleObject('Outlook.Application');
{ Get the MAPI NameSpace object. }
Mapi := OutlookApp.GetNameSpace('MAPI');
{ Get the Items collection from the Contacts folder. If you don't do this, FindNext will not work. }
ApptItems := Mapi.Folders('Personal Folders').
Folders('Calendar').Items;
{ Load Contacts into table. }
with ApptTable do
begin
EmptyTable;
Open;
DisableControls;
CurrentAppt := ApptItems.Find('[Start] > ' + '"4/27/99" and [AllDayEvent] = True');
while not VarIsEmpty(CurrentAppt) do
begin
Insert;
FieldByName('Start').AsDateTime := CurrentAppt.Start;
FieldByName('Subject').AsString := CurrentAppt.Subject;
FieldByName('End').AsDateTime := CurrentAppt.End;
FieldByName('Busy').AsBoolean := CurrentAppt.BusyStatus;
Post;
CurrentAppt := ApptItems.FindNext;
end; // while
EnableControls;
end; // with
{ Close Outlook. }
OutlookApp := Unassigned;
end;

//end Listing Four
 
哈哈,老乡又出手了。我的晚饭还没吃,搞不出来真气啊。我看看先。
 
老乡,慢慢看吧,下面是我测试的一点东西,没有解决问题,不过有点眉目,呵呵。
估计你解决问题最终还是需要看VBA。

uses
comobj, outlook2000;

procedure TForm1.Button1Click(Sender: TObject);
var
OutlookApp, Mapi, InboxFolder, MailItem1, Item: OleVariant;
I: Integer;
begin
try
OutlookApp := GetActiveOleObject('Outlook.Application');
except
try
OutlookApp := CreateOleObject('Outlook.Application');
except
Exit;
end;
end;

Mapi := OutlookApp.GetNameSpace('MAPI');
Mapi.Logon('', '', False, False);

InboxFolder := Mapi.GetDefaultFolder(olFolderinbox);
for I := 1 to InboxFolder.Items.Count do
begin
ListBox1.Items.Add(InboxFolder.Items(I));
Item := InboxFolder.Items(I);
{ MailItem1.ConnectTo(InboxFolder.Items(I)); //这句怎么出错?该如何写?
InboxFolder.Items(I).SaveAs('E:/OA' + MailItem1.Subject + '.txt', olDoc);
InboxFolder.Items(i).SaveAs('E:/bb');
Item.SaveAs('E:/bb', olDoc);}
end;
OutlookApp := Unassigned;
end;
 
Delphi6可以编译,通过了,可是附件如何提取?老乡快来!
 
呵呵,看VBA吧,应该也不是很难的。照葫芦画瓢,呵呵,改成Delphi的就应该可以的。
C:/Program Files/Microsoft Office/Office10/2052/VBAOL10.CHM

示例
本 Visual Basic for Applications 示例使用 SaveAsFile 方法将当前打开项目的第一个附件作为文件保存在“My Documents”文件夹中,用附件的显示名称作为文件名。

Set myOlApp = CreateObject("Outlook.Application")
Set myItem = myOlApp.ActiveInspector.CurrentItem
Set myAttachments = myItem.Attachments
myAttachments.Item(1).SaveAsFile "C:/My Documents/" & _
myAttachments.Item(1).DisplayName
如果使用 VBScript,则不必创建 Application 对象。本示例说明如何使用 VBScript 执行相同任务。

Set myItem = Application.ActiveInspector.CurrentItem
Set myAttachments = myItem.Attachments
myAttachments.Item(1).SaveAsFile "C:/My Documents/" & _
myAttachments.Item(1).DisplayName
 
[:)][:)]
祝贺有成效,惭愧无能为力!
UP支持![:(][:(]

喂,是不是OFFICE XP中的OUTLOOK啊,那就好办多了,可惜还是没时间。况且已经快解决了。
 
pyzfl快说。xp有什么好办法?
 
多人接受答案了。
 
后退
顶部