1

Exchange Web 服务有一个ResolveNames()函数,我可以使用它来检索(除其他外)通过 EWS 登录到 Exchange Server 的 Active Directory 用户的主 SMTP 地址。

我现在正在通过 OLE 针对 Outlook 进行编程,并且想要相同的功能。

我一直在浏览Outlook 对象模型,但找不到合适的对象或方法。

有谁知道我可以用来获取主 SMTP 地址的对象/方法?

下面是我用来连接到 Outlook 的当前 Delphi 代码。
对于登录的默认用户 (AUserSMTP=''),它返回 OutlookApp COM 对象(通过 GetActiveOleObject 或 CreateOleObject)、一个名称空间(通过GetNameSpace)和一个文件夹(通过 GetDefaultFolder)对象,但我找不到从那里去的地方.
我认为 lNameSpace.CurrentUser (一个Recipient 对象)可能会导致某个地方,但它的 Address 属性只返回一个字符串,如'/o=TimeTell/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=developer'没有电子邮件地址。 ..

关于要走的路线有什么建议吗?

function TDataModuleSyncOutlook.ConnectToOutlook(AUserSMTP: String = ''): Boolean;
var
   lNameSpace, lRecipient: OleVariant;
begin
   Result      := false;
   FWasCreated := False;  
   try
      FOutlookApp := GetActiveOleObject(scxOutlookApp);
      Result := True;
   except
      try
         FOutlookApp := CreateOleObject(scxOutlookApp);
         FWasCreated := True;
         Result := True;
      except
         on E:Exception do ...
      end;
   end;
   if Result then      
   begin
      lNameSpace := FOutlookApp.GetNameSpace(scxNameSpace);
      if AUserSMTP <> '' then   // This part not applicable to the question   
      begin   // Open shared calendar als er een expliciete gebruiker is opgegeven...
         lRecipient := lNameSpace.CreateRecipient(AUserSMTP);
         try
            FCalendarFolder := lNameSpace.GetSharedDefaultFolder(lRecipient, olFolderCalendar);
         except
            on E:Exception do ...
         end;
      end
      else   // ... anders de default calendar folder openen
         FCalendarFolder := lNameSpace.GetDefaultFolder(olFolderCalendar);
   end;
   FOleInitialized := Result;
   if Result then TSyncLogger.LogAlways('Connected to Outlook') else TSyncLogger.LogAlways('Connection to Outlook failed');
end;
4

2 回答 2

0

我找到了。我必须通过命名空间中的 Accounts 对象:

for i := 1 to lNameSpace.Accounts.Count do
   if lNameSpace.Accounts.Item[i].AccountType = olExchange then
   begin
      lAccount := lNameSpace.Accounts.Item[i];
      Break;
   end;
if VarIsClear(lAccount) then
begin
   DisConnectFromOutlook;
   Exit;
end;
lLoginSMTP := lAccount.SmtpAddress;

我唯一仍然想要的是确定默认帐户

于 2013-08-05T12:32:37.507 回答
0

为什么不使用 Application.Session.CurrentUser.AddressEntry.GetExchangeUser.PrimarySmtpAddress (您当然需要检查空值)?

至于帐户顺序,您可以使用 Extended MAPI 和 IOlkAccountManager.GetOrder(如果您单击 IOlkAccountManager 按钮,您可以在OutlookSpy中使用该对象)或者您可以使用Redemption及其 RDOSession.Accounts.GetOrder 方法(参见http:// www.dimastr.com/redemption/RDOAccounts.htm)。返回集合中的第一个帐户将是默认帐户。

于 2013-08-05T14:40:49.210 回答