我正在使用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) 使用对Office365日历文件夹的订阅时,我ErrorReadEventsFailed在SendNotification请求中收到了很多消息.此错误实质上意味着无法再找到订阅,并且服务器不再需要新通知.
检查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 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或其他东西重装?请记住,我需要使用数千个项目来完成此操作,因此效率对我来说很重要.
我正在使用自动发现服务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)
如果我喜欢这样,我会犯一个错误:
无法找到自动发现服务
我必须做些什么来避免这个错误?
我使用EWS来获取交换电子邮件,但是如何从电子邮件正文中获取纯文本,而不使用HTML?
现在我用这个:
EmailMessage item = (EmailMessage)outbox.Items[i];
item.Load();
item.Body.Text
Run Code Online (Sandbox Code Playgroud) 我订阅了一个使用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命名空间中得到的只是Data和AutoDiscover命名空间,没有课程或任何东西).由于我找不到那些类或类似的东西,我有点卡住了.他还列出了一个DAV示例,但是,他的代码再次使用了我在我的EWS dll版本中找不到的类(14.0.0.0).我尝试从Microsoft下载最新的API,但这似乎与我已有的版本相同.
所以我的问题是,有没有办法使用Exchange 2007 Web服务将项目标记为已读?
谁能告诉我如何使用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谢谢.
当我尝试使用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
我的任务是在.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)
马上,我遇到了ExchangeService和ExchangeServiceBinding("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上找到了解决方法.我已经按照指示对该部分进行了评论,并确实使警告消失了,所以就这样了.
但错误并不容易解决: …
我在Exchange邮箱中有一个文件夹,它是根目录(不是收件箱)的子项.
如何使用EWS托管API获取此类文件夹的ID?
我找到的只有与WellKnownFolderNames有关的例子.