Walter wrote: > Please post to the group. > > I would like to see them as well > > > Thanks, > > > Walt You got it. The line/space formatting might not be exact since I'm pasting from an e-mail I sent happy-jack, but here goes: ------------------------------------------------ First of all, check out the CDO Live website for details on how to interface with all of the MAPI properties that correspond to calendar, contact, message, etc. data. Here's a page that I relied upon --> http://www.cdolive.com/cdo10.htm. If you wrote Perl scripts that interfaced with MAPI objects then you probably are familiar with what is involved. For the most part I just looked at the VB samples on the CDO Live website and turned the syntax around so that they worked in Ruby. Below is a sample method of a MAPI query that I created to pull contact information from a Sales Contacts folder that's in the Exchange Public Folders at my company. I use the last name and the last 4 digits of the home telephone number as selection criteria. I create the Sales Contacts folder object in Ruby using win32ole and my own mapi profile housed in Outlook. Since this folder object creation is used in other areas of my program I saved it as a method that can be reused. def getSalesContacts # create the Exchange server session session = WIN32OLE.new('Mapi.Session') session.logon('Greg Kujawa') # navigate to the Sales Contacts entry underneath All Public Folders publicFolders = String.new recordCount = session.InfoStores.count recordCount.times { |i| publicFolders = session.InfoStores.Item(i+1).RootFolder.Folders if session.InfoStores.Item(i+1).name == "Public Folders" } allPublicFolders = String.new recordCount = publicFolders.count recordCount.times { |i| allPublicFolders = publicFolders.Item(i+1).Folders if publicFolders.Item(i+1).name == "All Public Folders" } salesContacts = String.new recordCount = allPublicFolders.count recordCount.times { |i| salesContacts = allPublicFolders.Item(i+1).messages if allPublicFolders.Item(i+1).name == "Sales Contacts" } return salesContacts end def getMAPIRecordset(lastName, homePhone) @allContacts = getSalesContacts @recordCount = @allContacts.count @resultSet = Array.new lastName.gsub!(/\s+/, "") @lastName = lastName.downcase homePhone.gsub!(/\s+|\D+/, "") homePhone =~ /(\d\d\d\d)$/ @homePhone = $1 @recordCount.times do |i| # iterate through the record count to find the record based on given criteria begin @contactLastName = String.new @contactLastName << @allContacts.Item(i+1).Fields.Item(@cdoPR_SURNAME).Value.to_s.downcase rescue @contactLastName = "Invalid" end begin @contactHomePhone = String.new @contactHomePhone << @allContacts.Item(i+1).Fields.Item(@cdoPR_HOME_TELEPHONE_NUMBER).Value rescue @contactHomePhone = "Invalid" end if @contactLastName == @lastName and @contactHomePhone[-4..-1] == @homePhone begin @resultSet[0] = @allContacts.Item(i+1).Fields.Item(@cdoPR_DISPLAY_NAME).value.to_s rescue @resultSet[0] = " " end begin @resultSet[1] = @allContacts.Item(i+1).Fields.Item(@cdoPR_COMPANY_NAME).value.to_s rescue @resultSet[1] = " " end begin @resultSet[2] = @allContacts.Item(i+1).Fields.Item(@cdoPR_SURNAME).value.to_s rescue @resultSet[2] = " " end begin @resultSet[3] = @allContacts.Item(i+1).Fields.Item(@cdoPR_MIDDLE_NAME).value.to_s rescue @resultSet[3] = " " end begin @resultSet[4] = @allContacts.Item(i+1).Fields.Item(@cdoPR_GIVEN_NAME).value.to_s rescue @resultSet[4] = " " end begin @resultSet[5] = @allContacts.Item(i+1).Fields.Item(@cdoPR_STREET_ADDRESS).value.to_s rescue @resultSet[5] = " " end begin @resultSet[6] = @allContacts.Item(i+1).Fields.Item(@cdoPR_LOCALITY).value.to_s rescue @resultSet[6] = " " end begin @resultSet[7] = @allContacts.Item(i+1).Fields.Item(@cdoPR_STATE_OR_PROVINCE).value.to_s rescue @resultSet[7] = " " end begin @resultSet[8] = @allContacts.Item(i+1).Fields.Item(@cdoPR_POSTAL_CODE).value.to_s rescue @resultSet[8] = " " end begin @resultSet[9] = @allContacts.Item(i+1).Fields.Item(@cdoPR_BODY).value.to_s rescue @resultSet[9] = " " end begin @resultSet[10] = @allContacts.Item(i+1).Fields.Item(@cdoPR_CUSTOMER_NUMBER).value.to_s rescue @resultSet[10] = " " end begin @resultSet[11] = @allContacts.Item(i+1).Fields.Item(@cdoPR_BIRTHDAY).value.to_s rescue @resultSet[11] = " " end begin @resultSet[12] = @allContacts.Item(i+1).Fields.Item(@cdoPR_WEDDING_ANNIVERSARY).value.to_s rescue @resultSet[12] = " " end begin @resultSet[13] = @allContacts.Item(i+1).Fields.Item(@cdoPR_SPOUSE_NAME).value.to_s rescue @resultSet[13] = " " end begin @resultSet[14] = @allContacts.Item(i+1).Fields.Item(@cdoPR_HOME_ADDRESS_CITY).value.to_s rescue @resultSet[14] = " " end begin @resultSet[15] = @allContacts.Item(i+1).Fields.Item(@cdoPR_HOME_ADDRESS_POSTAL_CODE).value.to_s rescue @resultSet[15] = " " end begin @resultSet[16] = @allContacts.Item(i+1).Fields.Item(@cdoPR_HOME_ADDRESS_STATE_OR_PROVINCE).value.to_s rescue @resultSet[16] = " " end begin @resultSet[17] = @allContacts.Item(i+1).Fields.Item(@cdoPR_HOME_ADDRESS_STREET).value.to_s rescue @resultSet[17] = " " end begin @resultSet[18] = @allContacts.Item(i+1).Fields.Item(@cdoPR_HOME_ADDRESS_FAX_NUMBER).value.to_s rescue @resultSet[18] = " " end begin @resultSet[19] = @allContacts.Item(i+1).Fields.Item(@cdoPR_HOME_TELEPHONE_NUMBER).value.to_s rescue @resultSet[19] = " " end begin @resultSet[20] = @allContacts.Item(i+1).Fields.Item(@cdoPR_BUSINESS_FAX_NUMBER).value.to_s rescue @resultSet[20] = " " end begin @resultSet[21] = @allContacts.Item(i+1).Fields.Item(@cdoPR_BUSINESS_TELEPHONE_NUMBER).value.to_s rescue @resultSet[21] = " " end begin @resultSet[22] = @allContacts.Item(i+1).Fields.Item(@cdoPR_CELLULAR_TELEPHONE_NUMBER).value.to_s rescue @resultSet[22] = " " end begin @resultSet[23] = @allContacts.Item(i+1).Fields.Item(@cdoPR_ENTRYID).value.to_s rescue @resultSet[23] = " " end end end if @resultSet == [] or homePhone !~ /\d\d\d\d\d\d\d/ return 1 # failure else return @resultSet # success end end The begin-rescue-end statements should be better organized I'm sure. The problem seems to be cases where the contact field hasn't been defined. MAPI throws an error message rather than simply returning a nill/null value. The @cdo... variables are the MAPI properties that I pulled from the CDO Live website. A more in-depth reference can be found at http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cdo/html/05406029-3df3-42f2-b186-b41a1097d1a2.asp. I know my sample code doesn't directly deal with the Calendar MAPI object but if you use my stuff as a guide and look at the CDO Live website I'm sure you can get where you need to go. Hope this helps!