标签: exchangewebservices

如何检测C#中是否存在此字典密钥?

我正在使用Exchange Web服务托管API和联系人数据.我有以下代码,它是功能性的,但并不理想:

foreach (Contact c in contactList)
{
    string openItemUrl = "https://" + service.Url.Host + "/owa/" + c.WebClientReadFormQueryString;

    row = table.NewRow();
    row["FileAs"] = c.FileAs;
    row["GivenName"] = c.GivenName;
    row["Surname"] = c.Surname;
    row["CompanyName"] = c.CompanyName;
    row["Link"] = openItemUrl;

    //home address
    try { row["HomeStreet"] = c.PhysicalAddresses[PhysicalAddressKey.Home].Street.ToString(); }
    catch (Exception e) { }
    try { row["HomeCity"] = c.PhysicalAddresses[PhysicalAddressKey.Home].City.ToString(); }
    catch (Exception e) { }
    try { row["HomeState"] = c.PhysicalAddresses[PhysicalAddressKey.Home].State.ToString(); }
    catch (Exception e) { }
    try { row["HomeZip"] = c.PhysicalAddresses[PhysicalAddressKey.Home].PostalCode.ToString(); }
    catch …
Run Code Online (Sandbox Code Playgroud)

c# exchangewebservices ews-managed-api

452
推荐指数
4
解决办法
44万
查看次数

EWS API - 重新创建通知订阅时出错

使用对Office365日历文件夹的订阅时,我ErrorReadEventsFailedSendNotification请求中收到了很多消息.此错误实质上意味着无法再找到订阅,并且服务器不再需要新通知.

检查Microsoft建议的错误处理,解决方案是使用自动发现重新发现ExternalEwsUrl或EwsPartnerUrl,并创建新订阅.

使用Office365,通过OAuth2服务帐户的组合,AutoDiscovery服务似乎几乎不可能,因此我一直将其https://outlook.office365.com/EWS/Exchange.asmx用作主要的EWS端点.

但是,当我尝试为特定日历文件夹创建新订阅时,我不断收到一般500 ErrorNoRespondingCASInDestinationSite错误:

Exchange Web服务当前不可用于此请求,因为目标站点中的任何客户端访问服务器都无法处理该请求.

奇怪的是这只是在收到初始ErrorReadEventsFailed错误后直接发生的.如果我再试一次,比如30秒,请求就会顺利通过.

在做了一些研究之后,似乎大多数用户发现确保X-AnchorMailbox为服务帐户希望模拟的用户正确设置标题是有帮助的.我仔细检查了这个标题,确实是按照重新订阅的请求发送的.

这个问题可以通过指数退避解决方案解决,或者只是重试X次,直到请求通过.在我看来,当订阅"丢失"时,O365服务需要时间来更改Exchange服务器的DNS(这是我唯一能想到的).

任何帮助将不胜感激!

exchange-server exchangewebservices office365

80
推荐指数
1
解决办法
1602
查看次数

当我尝试通过EWS托管API读取/更新任务的.Body时出错 - "您必须先加载或分配此属性,然后才能读取其值."

我正在使用Exchange Web服务托管API来处理任务(Exchange 2007 SP1).我可以创造它们.但是,当我尝试进行更新时,它适用于除.Body字段之外的所有字段.每当我尝试访问(读取/更新)该字段时,它都会出现以下错误:

"You must load or assign this property before you can read its value."
Run Code Online (Sandbox Code Playgroud)

我使用的代码如下所示:

   //impersonate the person whose tasks you want to read
   Me.Impersonate(userName); //home-made function to handle impersonation

   //build the search filter
   Exchange.SearchFilter.SearchFilterCollection filter = New Exchange.SearchFilter.SearchFilterCollection();
   filter.Add(New Exchange.SearchFilter.IsEqualTo(Exchange.TaskSchema.Categories, "Sales"));

   //do the search
   EWS.Task exTask = esb.FindItems(Exchange.WellKnownFolderName.Tasks, filter, New Exchange.ItemView(Integer.MaxValue));

   exTask.Subject = txtSubject.Text;  //this works fine
   exTask.Body = txtBody.Text; //This one gives the error implying that the object isn't loaded
Run Code Online (Sandbox Code Playgroud)

奇怪的是,检查属性包显示该对象包含33个属性,但{Body}不是其中之一.该属性似乎是从基类.Item或其他东西继承而来的.

那么,我是否需要将对象重新加载为类型Item?或者通过.Bind或其他东西重装?请记住,我需要使用数千个项目来完成此操作,因此效率对我来说很重要.

exchange-server exchangewebservices ews-managed-api

34
推荐指数
3
解决办法
3万
查看次数

尝试使用EWS MANAGED API访问Exchange 2010帐户时,无法找到"自动发现服务"

我正在使用自动发现服务Url来获取指定的电子邮件地址.

ExchangeService Service = new ExchangeService(ExchangeVersion.Exchange2010);
Service.Credentials = new WebCredentials("username@domainname.com", "Password");
Service.AutodiscoverUrl("username@domainname.com");
Folder inbox = Folder.Bind(Service, WellKnownFolderName.Inbox);
Console.WriteLine("The folder name is" + inbox.DisplayName.ToString());
Run Code Online (Sandbox Code Playgroud)

如果我喜欢这样,我会犯一个错误:

无法找到自动发现服务

我必须做些什么来避免这个错误?

c# exchange-server exchangewebservices ews-managed-api

31
推荐指数
7
解决办法
6万
查看次数

EWS正文纯文本

我使用EWS来获取交换电子邮件,但是如何从电子邮件正文中获取纯文本,而不使用HTML?
现在我用这个:

EmailMessage item = (EmailMessage)outbox.Items[i];
item.Load();
item.Body.Text
Run Code Online (Sandbox Code Playgroud)

text exchange-server exchangewebservices

28
推荐指数
4
解决办法
4万
查看次数

使用Exchange Web Services 2007将电子邮件标记为已读

我订阅了一个使用Exchange Web Services 2007的电子邮件帐户,并在新电子邮件进入时处理附件.我想在处理完这些电子邮件后将其标记为"已读",但我发现它不是就像将"IsRead"属性设置为true一样简单.我甚至尝试过以下方法:

Dim msg As EmailMessage
msg.Load(New PropertySet({EmailMessageSchema.IsRead}))
msg.IsRead = True
Run Code Online (Sandbox Code Playgroud)

我发现如果我想要与消息的某些部分(如附件)进行交互,我必须加载特定的模式属性.我还尝试将消息直接绑定到新对象并加载其他属性:

Dim iID as ItemId = msg.Id
Dim tmpMsg as EmailMessage = EmailMessage.Bind(service, iID, New PropertySet(BasePropertySet.FirstClassProperties, EmailMessageSchema.IsRead))
tmpMsg.IsRead = True
Run Code Online (Sandbox Code Playgroud)

我没有运气.我已经google了一下,发现一个MSDN博客示例似乎应该可以工作,但是他有一些我似乎无法找到的Microsoft.Exchange.WebServices.SetItemFieldType类(比如类;我在WebServices命名空间中得到的只是DataAutoDiscover命名空间,没有课程或任何东西).由于我找不到那些类或类似的东西,我有点卡住了.他还列出了一个DAV示例,但是,他的代码再次使用了我在我的EWS dll版本中找不到的类(14.0.0.0).我尝试从Microsoft下载最新的API,但这似乎与我已有的版本相同.

所以我的问题是,有没有办法使用Exchange 2007 Web服务将项目标记为已读?

.net exchangewebservices

27
推荐指数
1
解决办法
1万
查看次数

如何使用EWS获取电子邮件正文,收据,发件人和CC信息?

谁能告诉我如何使用Exchange Web服务API获取电子邮件正文,收据,发件人,CC信息?我只知道如何获得主题.

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010);
    service.Credentials = new NetworkCredential("user", "password", "domain");
    service.Url = new Uri("https://208.243.49.20/ews/exchange.asmx");
    ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
    FindItemsResults<Item> findResults = service.FindItems(
        WellKnownFolderName.Inbox,
        new ItemView(10));

    foreach (Item item in findResults.Items)
    {
        div_email.InnerHtml += item.Subject+"<br />";
    }
Run Code Online (Sandbox Code Playgroud)

我的开发环境是asp.net c#Exchange-server 2010谢谢.

c# asp.net exchange-server exchangewebservices

25
推荐指数
2
解决办法
5万
查看次数

Exchange Web Service API和401未经授权的例外

当我尝试使用EWS API发送电子邮件时,出现以下错误:(in message.Send();)

请求失败.远程服务器返回错误:(401)未经授权.

我的代码如下:

ExchangeService exchangeService = new ExchangeService(ExchangeVersion.Exchange2007_SP1);

//WebService Uri
try
{
    exchangeService.Url = new Uri("https://exchangeserver/ews/exchange.asmx");
}
catch (Exception ex)
{
    throw new Exception(string.Format("WebService Uri:" + ex));
}

//Credentials
try
{
    exchangeService.Credentials = new WebCredentials("user@domain", "pwd", "domain");
}
catch (Exception ex)
{
    throw new Exception(string.Format("Credentials:" +  ex));
}

//Send a mail
try
{
    EmailMessage message = new EmailMessage(exchangeService);
    message.Subject = "Test";
    message.Body = "Test";
    message.ToRecipients.Add("destination@domain");
    message.Save();
    message.Send();
}
catch (Exception ex)
{
    throw ex;
}
Run Code Online (Sandbox Code Playgroud)

我在本网站上阅读了有关此问题的其他帖子,但他们无法解决我的问题.

c# exchange-server-2007 unauthorized exchangewebservices http-status-code-401

25
推荐指数
1
解决办法
4万
查看次数

Exchange Web Services 2010入门

我的任务是在.Net中编写一个SOAP Web服务,作为EWS2010和以前使用WebDAV连接到Exchange的应用服务器之间的中间件.(据我所知,WebDAV正在消失EWS2010,因此应用服务器将无法像之前那样连接,并且在没有WebDAV的情况下连接到EWS的指数更难.理论上是在.Net中实现它.应该比其他任何事情都容易......对吧?!)

我的最终目标是能够获取更新指定Exchange帐户的电子邮件,日历项,联系人和待办事项列表项.(删除目前不是必需的,但我可以将其构建以供将来考虑,如果它很容易的话).

我最初得到了一些示例代码,实际上它确实有效,但我很快意识到它已经过时了.使用的类型和类在当前文档中没有出现.

例如,用于创建与Exchange服务器的连接的方法是:

ExchangeService svc = new ExchangeService();
svc.Credentials = new WebCredentials(AuthEmailAddress, AuthEmailPassword);
svc.AutodiscoverUrl(AutoDiscoverEmailAddress);
Run Code Online (Sandbox Code Playgroud)

对于它的价值,这是使用示例代码附带的程序集:( Microsoft.Exchange.WebServices.dll"MEWS").

在我意识到这不是当前实现连接的标准方法之前,它起作用了,我尝试在它上面构建并添加一个创建日历项的方法,我从这里复制了:

static void CreateAppointment(ExchangeServiceBinding esb)
{
    // Create the appointment.
    CalendarItemType appointment = new CalendarItemType();

    ...
}
Run Code Online (Sandbox Code Playgroud)

马上,我遇到了ExchangeServiceExchangeServiceBinding("ESB")之间的区别; 所以我开始谷歌搜索试图找出如何获得ESB定义,以便该CreateAppointment方法将编译.我发现这篇博文解释了如何从WSDL生成代理类,我做了.

不幸的是,这引起了一些冲突,其中原始程序集中定义的类型Microsoft.Exchange.WebServices.dll(示例代码附带的)与我的新EWS.dll程序集中的类型(我services.wsdl根据Exchange服务器提供的代码编译)重叠.

我排除了MEWS装配,这只会让事情变得更糟.我从一些错误和警告到25个错误和2,510个警告.没有找到各种类型和方法.这里显然有些不对劲.

所以我回去追捕.我找到了添加服务引用和Web引用的说明(即在VS2008中采取的额外步骤),我想我已经回到了正确的轨道上.

我删除了(实际上,现在,只是排除了)我以前尝过的所有以前的程序集; 我添加了一个服务参考https://my.exchange-server.com/ews/services.wsdl

现在我只有1个错误和1个警告.

警告:
元素'transport'不能包含子元素'extendedProtectionPolicy',因为父元素的内容模型为空.

这是指我添加服务引用时对web.config所做的更改; 而我刚刚在SO上找到了解决方法.我已经按照指示对该部分进行了评论,并确实使警告消失了,所以就这样了.

但错误并不容易解决: …

.net c# exchange-server exchangewebservices

24
推荐指数
1
解决办法
5万
查看次数

Exchange Web服务FolderId用于未知的文件夹名称

我在Exchange邮箱中有一个文件夹,它是根目录(不是收件箱)的子项.

如何使用EWS托管API获取此类文件夹的ID?

我找到的只有与WellKnownFolderNames有关的例子.

c# exchangewebservices

23
推荐指数
3
解决办法
4万
查看次数