Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在公用文件夹中搜索-Exchange 2003_C#_Webdav_Exchange Server - Fatal编程技术网

C# 在公用文件夹中搜索-Exchange 2003

C# 在公用文件夹中搜索-Exchange 2003,c#,webdav,exchange-server,C#,Webdav,Exchange Server,我有一个程序,需要连接到我的公司Exchange 2003服务器,并查看公用文件夹中的特定文件夹。我最终会循环浏览这个文件夹并扫描(使用OCR)每封电子邮件,这样我就可以解析数据库的信息 然而,我甚至不知道如何开始这样做。我在网上看到了WebDAV,这似乎是在C#和Exchange2003服务器上实现这一点的唯一方法。如果有人能告诉我一个更简单的方法那就好了 如果没有,那么请给我一些关于WebDAV的简单解释。我在网上看到的关于它的东西使它看起来比我想象的要复杂得多。至少对于我正在尝试执行的任务

我有一个程序,需要连接到我的公司Exchange 2003服务器,并查看公用文件夹中的特定文件夹。我最终会循环浏览这个文件夹并扫描(使用OCR)每封电子邮件,这样我就可以解析数据库的信息

然而,我甚至不知道如何开始这样做。我在网上看到了WebDAV,这似乎是在C#和Exchange2003服务器上实现这一点的唯一方法。如果有人能告诉我一个更简单的方法那就好了


如果没有,那么请给我一些关于WebDAV的简单解释。我在网上看到的关于它的东西使它看起来比我想象的要复杂得多。至少对于我正在尝试执行的任务。

首先添加对Microsoft.Office.Interop.Outlook的引用,然后使用语句添加这些引用

using Microsoft.Office.Interop.Outlook;
using _Application = Microsoft.Office.Interop.Outlook._Application;
using Outlook = Microsoft.Office.Interop.Outlook;
然后加上这个

//declare Outlook application             
_Application objOutlook = new Outlook.Application();  //create it
_NameSpace objNs = objOutlook.Session; //create new session

MAPIFolder oPublicFolders = objNs.Folders["Public Folders"];
MAPIFolder oAllPublicFolders = oPublicFolders.Folders["All Public Folders"];
Items itms = oAllPublicFolders.Items;

foreach (MailItem item in itms)
{
     GetNewMailItem(objOutlook, objContacts, item);
}

Marshal.ReleaseComObject(objOutlook); //release outlook com object
下一部分就是我所做的,请更改所有代码以满足您的需要

private static void GetNewMailItem(_Application objOutlook, MAPIFolder objContacts, MailItem item)
{
     if(item.ReceivedTime.Date == DateTime.Now.Date.AddDays(-1) || item.UnRead)
     {
          if (item.Attachments.Count > 0)
          {
               var attachments = item.Attachments;
               foreach (Attachment attachment in attachments)
               {
                    if(attachment.Type == OlAttachmentType.olEmbeddeditem)
                    {
                         ProcessEmbeddedEmailAttachment(attachment, objOutlook, objContacts);
                    }
                    else if (attachment.FileName.EndsWith(".doc") || attachment.FileName.EndsWith(".docx"))
                    {
                         ExtractAttachment(attachment);
                         item.UnRead = false;
                    }
               }
          }
     }
}
我省略了其余的代码,因为它是特定于我的处理过程的。

MAPI与此类似(您需要安装CDO 1.21-更高版本的Exchange不再使用CDO,而是使用Exchange Web服务)

将对MAPI的引用添加到项目中。代码与另一个答案类似:

var session = new Session();

// Need this to pass null values to MAPI calls - can't remember why exactly - YMMV
object mObj = System.Reflection.Missing.Value;
session.Logon(MailProfileName, mObj, false, mObj, mObj, mObj, mObj);

// Get the inbox for now for the current user
inbox = (Folder)session.GetDefaultFolder(1);

// more processing etc...

显然,请查看CDO参考-上面的代码最初用于处理所选配置文件收件箱中的一些邮件项目

应该注意,此解决方案取决于在运行其代码的任何计算机上安装Microsoft Outlook。是,您应该考虑使用MAPI而不是Outlook自动化。代码非常相似(因为Outlook只是包装MAPI)