Using Outlook Contacts In Delphi XE7

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-07 03:03:44

问题


I am trying to get a list of all outlook contacts using delphi.

I found a couple of examples, all seemed to be outdated or flawed.

Currently I have the following code, but when I excecute the command at runtime I get the below error:

Code:

procedure Tinvite_friends.BitBtn2Click(Sender: TObject);
const
  olFolderContacts = $0000000A;
var
  outlook, NameSpace, Contacts, Contact: OleVariant;
  i: Integer;
begin
  Try
   outlook:=GetActiveOleObject('Outlook.Application');
  Except
    outlook:=CreateOleObject('Outlook.Application');
  End;
  NameSpace := outlook.GetNameSpace('MAPI');

  Contacts := NameSpace.GetDefaultFolder(olFolderContacts);
  for i := 1 to Contacts.Items.Count do
  begin
    Contact := Contacts.Items.Item(i);
    {now you can read any property of contact. For example, full name and
     email address}
    ShowMessage(Contact.FullName + ' <' + Contact.Email1Address + '>');
  end;

  Outlook := UnAssigned;
end;

Error Message:

Project appname.exe raised exception class EOLeSysError with message 'Invalid class string'.

The project does not get passed the below code before throwing the error.

Try
 outlook:=GetActiveOleObject('Outlook.Application');
Except
 outlook:=CreateOleObject('Outlook.Application');
End;

Is there an effective way to get a list of all contacts from outlook imported to a memo for example?


回答1:


Maybe it's case sensitivity? I test for outlook.application:

const
  scxOutlookApp = 'outlook.application';
  scxNameSpace  = 'MAPI';

function TDataModuleSyncOutlook.ConnectToOutlook(AUserSMTP: String = ''): Boolean;
var
   lRecipient,
   lVar      : OleVariant;
   lLog,
   lLoginSMTP: String;
begin
   Result      := false;
   FWasCreated := False;  // Breakpoint 'Ignore subsequent exceptions' 
   try
      FOutlookApp := GetActiveOleObject(scxOutlookApp);         // Application object
      Result := True;
   except
      try
         FOutlookApp := CreateOleObject(scxOutlookApp);
         FWasCreated := True;
         Result := True;
      except
         on E:Exception do TSyncLogger.LogError(E.Message);
      end;
   end;
   if Result then          // Breakpoint 'Handle subsequent exceptions' 
   begin
      FNameSpace := FOutlookApp.GetNamespace(scxNameSpace);
      // Solution from http://stackoverflow.com/questions/18053110/retrieve-outlook-logged-in-user-smtp-address-after-connecting-through-ole/
      lLog := Format('Connected to Outlook; Application.DefaultProfilename: %s, Application.Name: %s, Application.Version: %s, NameSpace.CurrentProfileName: %s, NameSpace.ExchangeMailboxServerName: %s, NameSpace.Type: %s',
        [FOutlookApp.DefaultProfileName,
         FOutlookApp.Name,
         FOutlookApp.Version,
         FNameSpace.CurrentProfileName,
         FNameSpace.ExchangeMailboxServerName,
         FNameSpace.Type]);
      TSyncLogger.LogDetail(lLog);
      lVar := FOutlookApp.Session;                                   // NameSpace object for the current session
      if not VarIsClear(lVar) then lVar := lVar.CurrentUser;         // Recipient object for the currently logged-on user
      if not VarIsClear(lVar) then lVar := lVar.AddressEntry;        // AddressEntry object for the recipient
      if not VarIsClear(lVar) then lVar := lVar.GetExchangeUser;     // Returns an ExchangeUser object that represents the AddressEntry
      if not VarIsClear(lVar) then lVar := lVar.PrimarySmtpAddress;  // String representing the SMTP address for the ExchangeUser
      if not VarIsClear(lVar) then
      begin
         lLoginSMTP := FOutlookApp.Session.CurrentUser.AddressEntry.GetExchangeUser.PrimarySmtpAddress;
         TSyncLogger.LogDetail('Primary Exchange SMTP address detected as: ' + lLoginSMTP);
      end
      else
      begin
         TSyncLogger.LogError(sErrNoExchangeAccount);
         DisConnectFromOutlook;
         Exit;
      end;
      if LowerCase(AUserSMTP) <> Lowercase(lLoginSMTP) then
      begin   // Open shared calendar if it's a different user
         lRecipient := FNameSpace.CreateRecipient(AUserSMTP);
         try
            FCalendarFolder := FNameSpace.GetSharedDefaultFolder(lRecipient, olFolderCalendar);
            lLog := Format('Logging in as different user (%s), created recipient for %s, GetSharedDefaultFolder folder path = %s',[AUserSMTP,lRecipient.Address,FCalendarFolder.FolderPath]);
            TSyncLogger.LogAlways(lLog);
         except
            on E:Exception do
            begin
               Result := false;
               TSyncLogger.LogError(Format(sErrOpenGedeeldeAgenda,[AUserSMTP]));
            end;
         end;
      end
      else   // ... otherwise open default calendar folder
      begin
         FCalendarFolder := FNameSpace.GetDefaultFolder(olFolderCalendar);
         TSyncLogger.LogDetail('Opened default calendar folder, folder path = ' + FCalendarFolder.FolderPath);
      end;
   end;
   FOleInitialized := Result;
   if Result then TSyncLogger.LogDetail('Connected to Outlook') else TSyncLogger.LogAlways('Connection to Outlook failed');
end;

Notes:
1. This opens the default calendar for any user, but you would not need to go that far (besides, your issue is earlier)
2. TSyncLogger is our logging handler
3. FOleInitialized, FWasCreated: Boolean; FOutlookApp, FNameSpace, FCalendarFolder: OleVariant; are some private properties we maintain
4. Essential to this code is that it first does a GetActiveOleObject to catch a running instance of Outlook; if that fails it does a CreateOleObject



来源:https://stackoverflow.com/questions/34565403/using-outlook-contacts-in-delphi-xe7

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!