【问题标题】:Exchange Web Services bind Mailbox folder using FolderID and reflectionExchange Web 服务使用 FolderID 和反射绑定邮箱文件夹
【发布时间】:2013-12-20 07:18:28
【问题描述】:

我正在尝试在运行时加载 Exchange Web 服务 DLL 并连接到邮箱。我正在关注本指南:Using Reflection to load unreferenced assemblies at runtime in C# 到目前为止的代码:

  var DLL = Assembly.LoadFile(@"Microsoft.Exchange.WebServices.dll");
  var theType = DLL.GetType("Microsoft.Exchange.WebServices.Data.ExchangeService");
  var c = Activator.CreateInstance(theType);
  var method = theType.GetMethod("AutodiscoverUrl");
  method.Invoke(c, new object[] { @"anyvalid@email.com" });

在那段代码之后我迷路了。如何使用 ExchangeService 通过 FolderId 绑定邮箱对象? EWS 托管 API 不适用于我的服务器和应用程序。

这是我试图在 ASP.NET 中实现的 Powershell 脚本等效代码:

  $MailboxName = "account@domain"
  $dllpath = "Microsoft.Exchange.WebServices.dll"
  [void][Reflection.Assembly]::LoadFile($dllpath)
  $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP1)
  $service.AutodiscoverUrl("anyvalid@email.com")
  $mbfolderid= new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Root,$MailboxName)     
  $MsgRoot = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$mbfolderid)

【问题讨论】:

  • 为什么不能引用Microsoft.Exchange.WebServices.dll,不经过反思就可以使用?

标签: reflection exchangewebservices


【解决方案1】:

使用反射很乏味。不过,您走在正确的轨道上。以下代码显示了如何绑定到“收件箱”文件夹并获取前 10 封电子邮件的主题。

请注意我如何使用 dynamic关键字,因此我不必调用 MethodInfo.Invoke 来调用反射类型的实例方法。

string mailboxName = "...";

// Get value for enum WellKnownFolderName.Inbox.
var wellKnownFolderNameType = assem.GetType("Microsoft.Exchange.WebServices.Data.WellKnownFolderName");
var rootFolderName = wellKnownFolderNameType
    .GetField("Inbox")
    .GetValue(null)
    ;

// Create requested mailbox and folderid for Inbox-folder for the requested mailbox.
var mailboxType = assem.GetType("Microsoft.Exchange.WebServices.Data.Mailbox");
dynamic mailbox = Activator.CreateInstance(mailboxType, new object[] { mailboxName });

var folderIdType = assem.GetType("Microsoft.Exchange.WebServices.Data.FolderId");
dynamic folderId = Activator.CreateInstance(folderIdType, rootFolderName, mailbox);

// Bind to the Inbox-folder for the requested mailbox.
var folderType = assem.GetType("Microsoft.Exchange.WebServices.Data.Folder");
var bindMethod = folderType.GetMethod("Bind", new Type[] { serviceType, folderIdType });

dynamic folder = bindMethod.Invoke(null, new object[] { service, folderId });

// Get 10 first mailitems 
var itemViewType = assem.GetType("Microsoft.Exchange.WebServices.Data.ItemView");
dynamic itemView = Activator.CreateInstance(itemViewType, 10);

dynamic findItemsResults = folder.FindItems(itemView);
foreach (dynamic item in findItemsResults.Items)
{
    Console.WriteLine((string) item.Subject);
}

【讨论】:

  • 感谢您的出色解决方案!我非常感谢您的帮助
猜你喜欢
  • 2011-12-16
  • 2017-02-11
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
相关资源
最近更新 更多