Exchange Web服务使用FolderID和反射绑定邮箱文件夹

时间:2013-12-20 07:18:28

标签: reflection exchangewebservices

我正在尝试在运行时加载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)

1 个答案:

答案 0 :(得分:2)

使用反射很繁琐。你虽然走在正确的轨道上。以下代码显示如何绑定到“收件箱”文件夹并获取前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);
}
相关问题