AddressBook Object for Windows? Outlook Import/Export?

We have the AddressBook Object is for Mac OS X Contacts. Is there any counterpart for Windows Mail and/or Outlook Address Book? Or does anybody know how to access Outlook Address Books from Xojo? I would try to get info via ODBC but I am not sure if there are other more handy ways to import or export Contacts on Windows.

I’ve used Visual Basic Scripting with Xojo to read/write outlook calendar info. I imagine the same can be done for the Address Book.

Mmmm do you know a link or any online docs? Or do you have a VB Script sample for this I could start with? At least any script writing a textfile I could re-read and import in my xojo app would help. Otherwise an seamless export/import would be perfect.

Disclaimer: This is hacked by a novice in this area. I’d love to see an easier way.

I also noticed this uses MBS but I know I’ve done it without in the past

This is what I have used for getting user appointments from the exchange server.
This script is a constant in my app (kGetCalendarAppts)
USERNAME, STARTDATE & ENDDATE are replaced prior to running. (see below)

[code]Call subOutlookAppointments() 'Displays Outlook Tasks with a due date of today or before

Sub subOutlookappointments

    Dim objOutlook
    Dim objNameSpace
    Dim objFolder
    Dim MyItems
    Dim CurrentItem
    Dim CurrentAppointment
    Dim fso, MyFile
    Dim myRecipient

    Const olFolderCalendar = 9

    'Create Outlook, Namespace, Folder Objects and Task Item
    Set objOutlook = CreateObject("Outlook.application")
    Set objNameSpace = objOutlook.GetNameSpace("MAPI")
    Set objFolder = objNameSpace.GetDefaultFolder(olFolderCalendar)
    Set myRecipient = objNameSpace.CreateRecipient("USERNAME") ' USERNAME
    Set SharedFolder = objNameSpace.GetSharedDefaultFolder(myRecipient,olFolderCalendar)
    Set MyItems = SharedFolder.Items
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set MyFile= fso.CreateTextFile("C:\\Users\\pfargo\\Desktop\\testfile.txt", True)
    
    dtStart = CDate(#STARTDATE#) ' STARTDATE
    dtEnd = CDate(#ENDDATE#) ' ENDDATE
    
    myItems.IncludeRecurrences = True
    myItems.Sort "[Start]"
    
    For Each CurrentItem In MyItems
    
        Set CurrentAppointment = CurrentItem
        
        If CurrentAppointment.Start < dtStart Then
        
        ElseIf CurrentAppointment.Start >= dtStart And CurrentAppointment.Start <= dtEnd Then
        
           strOutput = strOutput & "<blockquote><b>Notes: </b>" & CurrentAppointment.body & "</blockquote>" & vbCrLF & vbCrLf
           MyFile.WriteLine("<Appt>")
           MyFile.WriteLine("<subject>" & CurrentAppointment.subject) & "</subject>"
           MyFile.WriteLine("<start>" & CurrentAppointment.start) & "</start>"
           MyFile.WriteLine("<duration>" & CurrentAppointment.Duration) & "</duration>"
           MyFile.WriteLine("<location>" & CurrentAppointment.location) & "</location>"
           MyFile.WriteLine("<body>" & CurrentAppointment.body) & "</body>"
           MyFile.WriteLine("</Appt>")
           
        ElseIf CurrentAppointment.Start > dtEnd Then
        
            Exit For
            
        End If  
    Next

	'Clean up
	MyFile.Close

    Set objFolder = Nothing
    Set objNameSpace = Nothing
    Set objOutlook = Nothing

End Sub[/code]

The calling routine

[code]Sub GrabUserSchedule(UserName As String, dateStart As Date, dateEnd As Date)
ws = New WindowsScriptMBS

ws.Language = “VBScript”

Dim s As String = kGetCalendarAppts

s = Replace(s,“USERNAME”,UserName)
s = Replace(s,“STARTDATE”, dateStart.SQLDate)
s = Replace(s,“ENDDATE”, dateEnd.SQLDate)

ws.ExecuteStatement s

Dim outlookFile As FolderItem = SpecialFolder.Desktop.Child(“TestFile.txt”)

if outlookFile <> nil and outlookFile.Exists then

LoadOutlook(outlookFile,UserName)

end if

AssignColor(UserName)
End Sub
[/code]

Hopefully you can get some ideas from this. There is tons of info online but like other things - finding what you need is often a frustrating process.

If you don’t have MBS I believe I used to just write the script to a text file (.vbs) and then launch it using folderitem.launch (see next post)

This is the same idea manually launching it. This script is for launching FileMaker Scripts.

You’d most likely want to use the temp folder rather than the desktop for creating the files!

#If TargetWin32 Then

Dim f As FolderItem
Dim t As TextOutputStream

f = SpecialFolder.Desktop.Child("gotolead.vbs")
t = TextOutputStream.Create(f)

t.WriteLine "Option Explicit"
t.WriteLine "Dim fmApp, fmDocs, fmDoc, SH"
t.WriteLine "Dim theFile, theScript"
t.WriteLine "theFile = ""Leads"""
t.WriteLine "theScript = ""GotoLeadFromRB"""
' hook into FileMaker
t.WriteLine "Set fmApp = CreateObject(""FMPro.Application"")"
t.WriteLine "fmApp.Visible = True"
' bring FileMaker to the front
t.WriteLine "Set SH = CreateObject(""wscript.shell"")"
t.WriteLine "SH.AppActivate FMapp.Caption, True"
' get the collection of open files
t.WriteLine "Set fmDocs = fmApp.Documents"
' go find our target file
t.WriteLine "For Each fmDoc In fmDocs"
t.WriteLine "If InStr(LCase(fmDoc.fullname), LCase(thefile)) > 0 Then"
' this is our file, run the script
t.WriteLine "fmDoc.dofmscript (thescript)"
t.WriteLine "End If"
t.WriteLine "Next"
' clean up
t.WriteLine "Set SH = Nothing"
t.WriteLine "Set fmDoc = Nothing"
t.WriteLine "Set fmDocs = Nothing"
t.WriteLine "Set fmApp = Nothing"
t.close
f.Launch

#EndIf[/code]

Wow looks good, I will give it a try and will report later on this, thanks!

You can also use the Xojo OLEObject class. Except for “NameSpace” as Xojo’s Namespace (Bug and is reported) is in conflict with “Outlook.NameSpace”

From Microsoft’s link: http://msdn.microsoft.com/en-us/library/office/aa271596(v=office.11).aspx you can get an idea how to convert it to Xojo.

I made some small examples just to give you an idea how you can use the OLEObject class:

Count Folders in Outlook 2010:

  Dim myOlApp As OLEObject
  Dim myNameSpace As OLEObject
  Dim myFolder As OLEObject
  
  Dim myEnums as New Dictionary
  Dim Count, nEnums As Integer
  
  Dim outText As String
  
  myEnums.Value("olFolderInbox") = 6
  myEnums.Value("olFolderOutbox") = 4
  myEnums.Value("olFolderContacts") = 10
  myEnums.Value("olFolderSentMail") = 5
  myEnums.Value("olFolderJunk") = 23
  
  // Enumeration See: http://msdn.microsoft.com/en-us/library/office/bb208072%28v=office.12%29.aspx
  
  
  myOlApp = New OLEObject("Outlook.Application")
  myNameSpace = myOlApp.GetNameSpace("MAPI")
  
  For nEnums = 0 to myEnums.Count -1 
    myFolder = myNameSpace.GetDefaultFolder(myEnums.Value(myEnums.key(nEnums)))
    Count = myFolder.Items.count
    outText = outText +myFolder.invoke("Name")+":  "+str(count)+EndOfLine.Windows
  Next
  
  Msgbox(outText)

  myOlApp = Nil 

  exception err as oleexception
    msgbox err.message

Sent an email with use of Outlook:

  Dim ToAddress As String
  Dim MessageSubject As String
  Dim MessageBody As String
  //Dim MessageAttachment
  
  Dim ol, ns, olMailItem, myRecipient As OLEObject
  Dim newMail As OLEOBJECT
    
  ToAddress = "me@address.com"   ' change this...
  MessageSubject = "How to use Outlook with Xojo"
  MessageBody = "*BODY* email via MAPI *BODY*"
    
  ol = New OLEObject ("Outlook.Application")
  ns = ol.getNamespace("MAPI")
  ns.logon "","",true,false
  
  newMail = ol.CreateItem(olMailItem)
    
  newMail.Subject = MessageSubject
  newMail.Body = MessageBody + EndOfLine
  
  '' validate the recipient, just in case...
  myRecipient = ns.CreateRecipient(ToAddress)
  myRecipient.Resolve
  If Not myRecipient.Resolved Then
    MsgBox "unknown recipient"
  Else
    newMail.Recipients.Add(myRecipient)
    newMail.Send
  End If
  
  ol = Nil
  
exception err as oleexception
  msgbox err.message

Open outlook Mail Item:

  Dim myOlApp As OLEObject
  Dim myItem As OLEObject
  Dim olMailItem As OLEObject
  
  myOlApp = New OLEObject("Outlook.Application")
  myItem = myOlApp.CreateItem(olMailItem)

  myItem.Display

Thank you John or sharing. The OLEObject looks like a much better approach than mine. Time to dive back into MS reference materials. (yuck)

[quote=37991:@John Hansen]Open outlook Mail Item:

Dim myOlApp As OLEObject
Dim myItem As OLEObject
Dim olMailItem As OLEObject

myOlApp = New OLEObject(“Outlook.Application”)
myItem = myOlApp.CreateItem(olMailItem)

myItem.Display[/quote]

I just noticed a typo in the above example. The above example works but “olMailItem” is an enumeration.

Should be like this:
Open outlook Mail Item

  Dim myOlApp As OLEObject
  Dim myItem As OLEObject
  
  // OlItemType Enumerations http://msdn.microsoft.com/en-us/library/office/ff869291.aspx
  const olMailItem = 0
  const olContactItem = 2
  
  
  myOlApp = New OLEObject("Outlook.Application")
  myItem = myOlApp.CreateItem(olMailItem)
  myItem.Display
  
  myOlApp = Nil
  
    exception err as oleexception
    msgbox err.message

I just had a little bit of time to make another example how to get the entries from the Outlook 2010 Contact folder.
Not sure if it works for earlier versions of Outlook.

Display contact entries

  Dim myOlApp As OLEObject
  Dim myNamespace As OLEObject
  Dim myContacts As OLEObject
  Dim myItems As OLEObject
  Dim myItem As OLEObject
  
  Dim nItems As Integer
  
  Dim outText As String
   
  // Enumeration See: http://msdn.microsoft.com/en-us/library/office/bb208072%28v=office.12%29.aspx
  Const olFolderContacts = 10
  
  myOlApp = NEW OLEObject("Outlook.Application")
  myNamespace = myOlApp.GetNamespace("MAPI")
  myContacts = myNameSpace.GetDefaultFolder(olFolderContacts)
  myItems = myContacts.Items
  nItems = myItems.count
  
  outText = "Total number of contacts: " + str(nItems) + EndOfLine.Windows + EndOfLine.Windows
  
  If nItems > 5 Then nItems = 5   // in this case we only want to show max 5 contacts
  
  For i as integer = 1 to nItems 
    myItem = myContacts.Items(i)
    
    outText = outText + "Full Name: "+ myItem.FullName + EndOfLine.Windows _
    + "Company:  " + myItem.CompanyName + EndOfLine.Windows _
    + "Job Title:  " + myItem.JobTitle + EndOfLine.Windows _
    + "E-mail:  " +myItem.Email1Address + EndOfLine.Windows _
    + "Display as:  " + myItem.Email1DisplayName + EndOfLine.Windows  + EndOfLine.Windows
    
    // Contact Item info:  msdn.microsoft.com/en-us/library/office/aa210907%28v=office.11%29.aspx
  Next
  
  Msgbox outText
  
  myOlApp = Nil
  
exception err as oleexception
  msgbox err.message

John, great! This works! Will check this out how this behaves in Outlook 2003 and Exchange Server Environment on Monday.
Thanks!