2012-02-10 62 views
13

我试图从特定邮箱(我有权限)中使用Exchange Web服务托管API检索收件箱项目。我已经使用自己的电子邮件地址通过AutodiscoverUrl测试了代码,并且它工作正常。但是,当我尝试使用其他电子邮件地址时,EWS仍然检索我的自己的收件箱项目。这是由于缓存或什么?使用C#中的Exchange Web Services托管API检索错误的邮箱项目

我的代码如下:

ExchangeService ex = new ExchangeService(ExchangeVersion.Exchange2010_SP1); 
    ex.AutodiscoverUrl("[email protected]"); 

    FindItemsResults<Item> findResults = ex.FindItems(WellKnownFolderName.Inbox, new ItemView(10)); 

    foreach (Item item in findResults.Items) 
     Console.WriteLine(item.Subject); 

回答

29

AutodiscoverUrl电子邮件地址无关与邮箱,你可以绑定到。

有(至少)两种方式从另一个用户邮箱获取收件箱项目:委派访问和模拟。

如果您有其他用户邮箱的代理访问,您可以指定邮箱作为调用的参数来FindItems

FindItemsResults<Item> findResults = ex.FindItems(
    new FolderId(WellKnownFolderName.Inbox, new Mailbox("[email protected]")), 
    new ItemView(10)); 

如果你有permissions to impersonate其他用户,你可以在其他冒充用户连接到EWS时及以下调用FindItem将在模拟用户的收件箱中工作:

ExchangeService ex = new ExchangeService(ExchangeVersion.Exchange2010_SP1); 
ex.AutodiscoverUrl("[email protected]"); 
ex.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "[email protected]"); 
ItemsResults<Item> findResults = ex.FindItems(WellKnownFolderName.Inbox, new ItemView(10)); 

免责声明:我写上面的代码,而无需实际测试它在真正的Exchange服务器。

+1

谢谢,因为我有委托访问(并没有模仿权限)我做了你的第一个方法,它的工作! – communista 2012-02-13 05:33:15

+1

节省!谢谢! – 2013-04-18 05:55:02

+0

我花了太多时间来解决这个问题:1)确定包含目标邮箱的过滤器:'Import-Module ActiveDirectory; get-aduser -filter * |其中{$ _。samaccountname-like“bob”}',2)创建一个包含目标邮箱的管理作用域'new-ManagementScope -Name bob_targetuser -RecipientRestrictionFilter {samaccountname-like“bob”}'; 3)将范围分配给对象ACL:'New-ManagementRoleAssignment -Name appimpersonationrole -Role ApplicationImpersonation -User usernamethatisallowedImpersonzationrights -CustomRecipientWriteScope bob_targetuser' – mbrownnyc 2017-08-11 15:36:35

11

如果你想发送电子邮件使用只有代表权限发送之前先保存电子邮件。它会设置发送消息所需的smtp地址。

 ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1); 
     service.Credentials = new WebCredentials("user1", "1234", "domain.com"); 
     service.AutodiscoverUrl("[email protected]"); 

     EmailMessage email = new EmailMessage(service); 
     email.ToRecipients.Add("[email protected]"); 
     email.Subject = "HelloWorld"; 
     email.Body = new MessageBody("Sent by using the EWS Managed API"); 

     //save it first! 
     email.Save(new FolderId(WellKnownFolderName.Drafts, "[email protected]")); 

     email.Send(); 

我用它来避免这个错误:“使作为账户的请求不具有一个邮箱时,必须对任何区分的文件ID指定邮箱主SMTP地址”

+1

我试图从使用模拟的共享帐户发送电子邮件,它没有与出现以下错误:“该帐户没有模拟请求的用户的权限。”然而,Exchange Online网站允许我以共享用户的身份发送电子邮件。直到我找到这个答案时,这一直困扰着我,这与我正在尝试做的事很相似。首先节省是关键。谢谢。附:我正在使用Save和SendAndSaveCopy。 – 2013-10-03 09:42:09

相关问题